2017-05-31 75 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与这两个进程进行通信。

希望它有帮助。