2011-05-17 79 views
0

我似乎無法弄清楚爲什麼會發生這種情況。我沒有使用任何可能調用WSAGetLastError()的套接字庫,因爲我只在Windows平臺上使用C套接字函數。我使用select()來管理多個UDP套接字,所以也許這與它有關。這是怎麼回事:UDP套接字上的recvfrom()返回-1,但WSAGetLastError()返回0

我有很多UDP套接字,我註冊一個fd_set和使用select()來檢查只有當讀取操作可用。我遍歷所有套接字並檢查FD_ISSET()以確保讀取操作可用。然後我調用recvfrom(),這似乎在大部分時間都有效,但偶爾當其中一個套接字發生一連串的活動時,recvfrom()將返回-1。當我對WSAGetLastError()進行後續調用時,它將返回0(並且這是我在整個應用程序中對WSAGetLastError的唯一調用)。如果我忽略錯誤,套接字將繼續正常工作。它能夠繼續收集數據並完成它的工作。這很奇怪。

我知道UDP套接字可能返回0(一個有效的空UDP包),這不是TCP(乾淨關閉)的情況,但-1也可能是正常的?我想也許這是由某種併發問題引起的,其中一個線程可能在socket上執行sendto()而recvfrom()處於被調用的過程中,所以我添加了一個互斥鎖來防止發生這種情況(但行爲仍然存在)。

我對整件事很困惑,所以任何建議或幫助將不勝感激。也許select()爲讀取操作添加套接字,而這些讀取操作實際上不是讀取操作?我非常確定TCP會在偵聽套接字上執行連接請求。

我在Visual Studio 2010中使用C++作爲我的編譯器和IDE。這是一個沒有MFC或任何廢話的控制檯應用程序。

謝謝!

回答

0

那麼,-1是SOCKET_ERROR,所以no:-1永遠不是正常值。另一次我看到這個錯誤是當你在TCP套接字上使用accept,但是在你調用accept的同一個套接字上調用recv,而不是調用accept的返回值。你確定你的recvfrom失敗是在正確的套接字上調用嗎?

+0

我發現它與此有關:http://support.microsoft.com/kb/263823 – user208301 2011-05-18 00:42:12

+0

哦。你使用的是Windows 2000? – Femi 2011-05-18 04:21:15

相關問題