2012-11-29 69 views
1

我將我的網絡代碼從Windows移植到Linux,但並非沒有問題。 出於某種原因,當我將套接字設置爲非阻塞時,recvfrom將無法正常工作。你看,在我調用recvfrom之後,errno總是EAGAIN,並且無論我接收多少個數據包都無關緊要,它始終是EAGAIN。如果我將設置套接字的代碼註釋掉爲無阻塞,代碼運行良好。那好它的工作,但它的攔截...使用非阻塞套接字。在調用recvfrom後,errno總是EAGAIN

下面是我使用的設置套接字非阻塞代碼:什麼我做錯了

int nonBlocking = 1; 
if (fcntl(handle, F_SETFL, O_NONBLOCK, nonBlocking) == -1) 
{ 
    std::cout << "failed to set non-blocking socket" << std::endl; 
    return false; 
} 

任何想法? (它的工作在我的Windows罰款生成使用:

DWORD nonBlocking = 1; 
ioctlsocket(handle, FIONBIO, &nonBlocking); 
+0

我打電話recvfrom的每一個循環。這就是爲什麼我需要它是非阻塞的。但是現在它不會阻止我的應用程序執行其他操作,但它會忽略/阻止我的傳入數據包? – grimgrom

+1

你是否說你讀取和處理數據包時,你沒有設置非阻塞套接字?無論如何,當沒有數據包時獲得EAGAIN是正常的。你怎麼知道它在任何時候都不應該返回EAGAIN? – nos

+0

我在問你,會嗎?如果errno ==到EAGAIN,丟棄數據包是錯誤的嗎? – grimgrom

回答

2

首先,在檢查errno值,你應該檢查的recvfrom()返回值

如果返回-1然後errno價值纔有意義。

recvfrom手冊頁:

如果沒有消息是vailable在插座處,接收呼叫等待 爲 消息到達,除非套接字是非阻塞的(參見fcntl(2)), 在這種情況下,值-1返回並且外部變量errno 設置爲EAGAIN。

一言以蔽之:

你打電話recvfrom的那一刻,沒有什麼閱讀