簡體   English   中英

使用非阻塞套接字。 調用recvfrom后,errno總是EAGAIN

[英]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()的返回值。

如果它返回-1errno值將有意義。

來自recvfrom頁:

如果套接字上沒有消息可用,則接收調用等待消息到達,除非套接字是非阻塞的(請參閱fcntl(2)),在這種情況下返回值-1並將外部變量errno設置為EAGAIN。

簡而言之:

在你打電話給recvfrom的那一刻,沒有什么可讀的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM