[英]Using non-blocking socket. errno is always EAGAIN after calling recvfrom
我正在將我的網絡代碼從Windows移植到Linux,但並非沒有問題。 出於某種原因,當我將套接字設置為非阻塞時,recvfrom將無法正常工作。 你看,在我調用recvfrom之后,errno總是EAGAIN而且我收到的包數無關緊要,它總是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 );
首先,在檢查errno
值之前,您應該檢查recvfrom()
的返回值。
如果它返回-1
則errno
值將有意義。
來自recvfrom
頁:
如果套接字上沒有消息可用,則接收調用等待消息到達,除非套接字是非阻塞的(請參閱fcntl(2)),在這種情況下返回值-1並將外部變量errno設置為EAGAIN。
簡而言之:
在你打電話給recvfrom
的那一刻,沒有什么可讀的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.