2012-08-08 248 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); 
}