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);
我打電話recvfrom的每一個循環。這就是爲什麼我需要它是非阻塞的。但是現在它不會阻止我的應用程序執行其他操作,但它會忽略/阻止我的傳入數據包? – grimgrom
你是否說你讀取和處理數據包時,你沒有設置非阻塞套接字?無論如何,當沒有數據包時獲得EAGAIN是正常的。你怎麼知道它在任何時候都不應該返回EAGAIN? – nos
我在問你,會嗎?如果errno ==到EAGAIN,丟棄數據包是錯誤的嗎? – grimgrom