2011-05-17 31 views
0

6次迭代後,發送返回-1又名SOCKET_ERROR。我試着加入了休眠功能,因此將通過循環再等待一秒鐘,但說得那麼它只會重複2次。什麼導致了這個錯誤?的WinSock2送返回SOCKET_ERROR 6之後循環迭代...爲什麼?

#pragma comment(lib, "ws2_32.lib") 

    #include <iostream> 
    #include <windows.h> 
     void main() 
    { 
     int reqVersion = 2; 

     WSADATA wsaData; 

     if (WSAStartup(MAKEWORD(reqVersion,0), &wsaData)==0) 
    { 
     // Check if major version is at least reqVersion 
     if (LOBYTE(wsaData.wVersion) >= reqVersion) 
     { 
      SOCKADDR_IN addr; 
      int addrlen = sizeof(addr); 

      SOCKET sListen; 
      SOCKET sConnect; 

      sConnect = socket(AF_INET, SOCK_STREAM, NULL); 

      addr.sin_addr.s_addr = inet_addr("192.168.0.7"); 
      addr.sin_family = AF_INET; 
      addr.sin_port = htons(1234); 


      if(connect(sConnect, (SOCKADDR*)&addr, sizeof(addr)) == 0) 
      { 
       char message[10] = "Hellooooo"; 
       for(int i = 0; i <50; i++) 
       { 
        int sendOutcome = send(sConnect, message, sizeof(message), 0); 
        if(sendOutcome == SOCKET_ERROR) 
        { 
         std::cout << "Socket Error..." << std::endl; 
        } 
        else 
        { 
         std::cout << "SENT..." << std::endl; 
        } 
        Sleep(1000); 
       } 
      } 
      else 
      { 
       std::cout << "Not Connected..." << std::endl; 
      } 

     } 
     else 
     { 
      std::cout << "Required version not available..." << std::endl; 
     } 

     // Cleanup winsock 
     if (WSACleanup()!=0) 
     { 
      std::cout << "Cleanup failed..." << std::endl; 
     } 
    } 
    else 
    { 
     std::cout << "Startup failed..." << std::endl; 
    } 
     system("PAUSE"); 
    } 
+3

什麼[Winsock錯誤](http://msdn.microsoft.com/en-us/library/ms740668(v = vs.85)的.aspx)你收到? – sarnold 2011-05-17 01:45:20

+0

我的意思是send函數正在返回SOCKET_ERROR常量,該常量被定義爲-1。 – Matthew 2011-05-17 02:23:53

+1

是的,這個小錯誤隱藏了很多_can_出錯的大部分:當函數返回_時,大多數Windows套接字2函數不返回錯誤的具體原因。因此,使用'WSAGetLastError'來找出[Winsock錯誤](http://msdn.microsoft.com/en-us/library/ms740668(v = vs.85).aspx)是什麼。 – sarnold 2011-05-17 02:28:01

回答

1

隨着sarnold的評論建議,獲取實際的錯誤總是有用的。

通常,檢查錯誤的套接字代碼在通過檢查SOCKET_ERROR返回值來檢測問題的代碼之後會調用WSAGetLastError()

你從WSAGetLastError()得到的錯誤代碼是很重要的,你可以,一旦你知道這意味着什麼,通常的原因這個問題。

可以使用FormatMessage()顯示此錯誤代碼的文本,也可以在WinError.h中頭看看它的手。

在這種情況下,10053是WSAECONNABORTED錯誤文本顯示「建立的連接被您的主機中的軟件中止」。

所以,我會假設你正在連接的服務器由於某種原因正在中止連接。沒有看到服務器源代碼,很難知道爲什麼會這樣。

相關問題