2017-05-31 80 views
0

我想通過TCP套接字連接到彼此的進程。我已經成功地做到了這一點,當這兩個過程都做在客戶端(一個Python進程)在本地運行:Python/C++遠程TCP套接字

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(("localhost", 11111)) 

服務器端是別人寫的,並在C++中實現。

#define WIDTH 640 
#define HEIGHT 480 
#define DEPTH 3 
#define BUFS (WIDTH*HEIGHT*DEPTH) 
int sockfd, newsockfd, portno; 
struct sockaddr_in serv_addr, cli_addr; 
socklen_t clilen; 

void netx_setup() 
{  
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = 11111; 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
       sizeof(serv_addr)) < 0) 
       error("ERROR on binding"); 
    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 

    std::cout<<"Waiting for connection\n"; 
    newsockfd = accept(sockfd, 
       (struct sockaddr *) &cli_addr, 
       &clilen); 
     if (newsockfd < 0) 
       { 
       std::cout<<"No connection!\n"; 
       newsockfd=0; 
       } 
} 

不過,我現在需要有我的本地機器上運行的客戶端在微軟Azure虛擬機實例運行時服務器進程。一旦建立連接,我已經擁有所有必要的代碼來處理所有事情,但我不確定如何爲此設置套接字。任何幫助將不勝感激!

+2

服務器看起來應該可以正常工作。只需將「localhost」替換爲客戶端代碼中Azure主機的地址即可。您可能需要在服務器上配置防火牆以允許遠程連接,但怎麼做似乎更像是[SuperUser](https://superuser.com/)問題。 –

+0

那你特別*要問什麼? –

+0

@JesperJuhl我需要將客戶端進程移動到Azure虛擬機。這樣做,我相信我需要修改客戶端進程代碼,以便它仍然可以找到C++服務器。我正在尋求修改客戶端連接的指導。根據每英里的建議,我已將「localhost」更改爲我的VM實例的IP地址,並通過我的端口啓用了入站/出站流量,但連接仍然失敗。 – Kevin

回答

0

根據你的描述,根據我的理解,我認爲你想在你的本地機器上部署你的C++服務器進程,並在Azure虛擬機上部署Python客戶端,並使它們相互通信。所以它是一個經典的C/S通信模型,如果您的本地機器具有WAN IP,您可以使您的客戶端連接到服務器端。如果沒有,您需要創建一個Azure VPN Gatewaycreate a Site-to-Site connection以通過其自己的VPN VIP與這兩個進程進行通信。

希望它有幫助。