2011-12-17 86 views
0

我無法使用connect()函數。我的代碼之前完全正常工作,但是現在我已經轉移到另一個物理網絡,並且阻止對connect()的調用不再有效,並且似乎無限期地掛起。通過UDP接收廣播仍然正常。回到舊的網絡,它再次正常工作。我不知道爲什麼它在一個網絡而不是另一個網絡上工作。我檢查了防火牆設置,它們是正確的。可能會發生什麼?Winsock connect()掛在一個網絡上,但不是另一個

我有一個預定義的端口正在使用,我從廣播中獲取地址。我用recievefrom從中 ret = recvfrom (bcast, bcast_read,sizeof(j4cDAC_broadcast),0,(sockaddr*)&from,&size);

to.sin_addr = from.sin_addr;

local.sin_addr.s_addr = inet_addr("0.0.0.0");

接收廣播,並設置傳出的IP地址,TCP連接我有

dac = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    // cout << "SOCKET\n"; 
     if (dac == INVALID_SOCKET) 
      { 
      SetConsoleTextAttribute(console,(WORD)12); 
      cout << "TCP socket failed: " << WSAGetLastError(); 
      connected_ = false; 
      return(1); 
      } 

     //set SO_REUSEADDR on a socket to true (1): 
     bool optval = true; 

     setsockopt(dac, SOL_SOCKET,SO_DONTLINGER,(const char*)&optval, sizeof(optval)); 

     int pies = setsockopt(dac, SOL_SOCKET,SO_REUSEADDR,(const char*)&optval, sizeof(optval)); 

     if (pies == SOCKET_ERROR) 
      { 
      SetConsoleTextAttribute(console,(WORD)12); 
      cout << "SETSOCKOPT ERROR: " << WSAGetLastError() << endl; 
      } // */ 
     local_T = local; 
     local_T.sin_port = htons ((short)TCPport); 

     //bind the tcp socket 
     bndt = bind(dac,(SOCKADDR*) &local_T,sizeof(local_T)); 

     if (bndt == SOCKET_ERROR) 
      { 
      SetConsoleTextAttribute(console,(WORD)12); 
      cout << "BIND TCP FAILED: " << WSAGetLastError(); 

      if (WSAGetLastError() == WSAEACCES) 
       cout << "ACCESS DENIED"; 

      cout << endl; 
      SetConsoleTextAttribute(console,(WORD)7); 
      shutdown(dac,2); 
      closesocket(dac); 

      connected_ = false; 
      return 1; 
      } 

     c = connect(dac, (sockaddr*) &to, size);  // <------- This hangs 

     if (c == SOCKET_ERROR) 
      { 
      cout << "connection problem: " << WSAGetLastError() <<endl; 
      } 

     connected_ = true;` 
+0

這兩個網絡是什麼樣的?你得到並嘗試連接到什麼地址?你是否嘗試過`tracert`到那個地址?看着wireshark的數據包? – 2011-12-17 07:09:17

回答

0

我發現這是VMWare虛擬網絡設備的一個問題。儘管我沒有運行任何虛擬機,但在對各種事情進行了大量測試之後,我發現設備廣播正在某個虛擬網絡接口上以某種方式接收。禁用這兩個設備已解決此問題。

相關問題