2012-08-08 251 views
0

我想创建一个简单的应用程序,它在两台远程计算机之间交换消息。 “127.0.0.1”ip工作正常,等待客户端确认并连接到客户端,但如果我尝试使用同一端口的本地“192.168.0.15”或全局IP,服务器立即连接到无需等待客户。C++ winsock服务器端客户端远程连接

这里是我的服务器代码的一部分:

char ip[20] = "127.0.0.1"; int port = 19385; 

SOCKET sockListen, sockConnect; 

SOCKADDR_IN address; 

sockConnect = socket (AF_INET, SOCK_STREAM, NULL); 
address.sin_addr.s_addr = inet_addr (ip); 
address.sin_family = AF_INET; 
address.sin_port = htons (port); 
sockListen = socket (AF_INET, SOCK_STREAM, NULL); 

bind (sockListen, (SOCKADDR*)&address, AddressSize); 
listen (sockListen, SOMAXCONN); 

sockConnect = accept (sockListen, (SOCKADDR*)&address, &AddressSize); 

...

请建议如何解决这个问题。 thx

+0

你为什么不尝试使用boost.Asio。你会为自己节省很多头痛。 – Caesar 2012-08-08 15:54:44

+0

不应该'sockConnect = socket(AF_INET,SOCK_STREAM,NULL);'初始化'sockListen'而不是'sockClient'? – Jaywalker 2012-08-08 16:14:08

+0

sockListen也在下面初始化。订单没关系 – user1585185 2012-08-08 16:23:19

回答

0

在致电accept()之前,您不应该初始化您的sockConnect变量socket()accept()返回一个新的分配的套接字句柄已经连接到客户端。您正在泄漏socket()分配的套筒手柄。

您只能将bind()设置为属于运行该应用程序的本地计算机的NIC的IP。您无法将bind()转换为外部IP。

您显示的代码根本没有执行任何错误处理。你需要补充的是,例如:

int errCode; 

SOCKET sockListen = socket (AF_INET, SOCK_STREAM, NULL); 
if (sockListen == INVALID_SOCKET) 
{ 
    errCode = WSAGetLastError(); 
    // ... 
} 
else 
{ 
    SOCKADDR_IN address = {0}; 
    address.sin_addr.s_addr = inet_addr (ip); 
    address.sin_family = AF_INET; 
    address.sin_port = htons (port); 

    if (bind (sockListen, (SOCKADDR*)&address, sizeof(address)) == SOCKET_ERROR) 
    { 
     errCode = WSAGetLastError(); 
     // ... 
    } 
    else 
    { 
     if (listen (sockListen, SOMAXCONN) == SOCKET_ERROR) 
     { 
      errCode = WSAGetLastError(); 
      // ... 
     } 
     else 
     { 
      int addressSize; 

      SOCKET sockClient = accept (sockListen, (SOCKADDR*)&address, &addressSize); 
      if (sockClient == INVALID_SOCKET) 
      { 
       errCode = WSAGetLastError(); 
       // ... 
      } 
      else 
      { 
       // ... 
       closesocket(sockClient); 
      } 
     } 
    } 

    closesocket(sockListen); 
}