我試圖在一個回圈中使用recv非阻塞模式讀取udp資料包,如下圖所示,然而呼叫總是回傳EAGAIN,但tcpdump顯示0資料包被內核丟棄,什么可能是EAGAIN的原因?
for ( ; ; )
{
const auto rc = ::recv(fd, data, maxSize, MSG_TRUNC)。
if (rc < 0)
{
switch (errno)
{
case (EINTR):
break;
case (EAGAIN):
spdlog::error("EAGAIN"/span>)。
...
}
}
else if (rc == 0)
{
throw std::runtime_error("Connection closed") 。
}
tcpdump ctrl C return:
捕獲668個資料包
981個資料包被過濾器接收
0個資料包被內核丟棄
uj5u.com熱心網友回復:
0包被內核丟棄只是意味著內核中的包捕獲機制沒有丟棄任何包。它與接收套接字沒有任何關系。
還要注意的是,tcpdump會在防火墻處理之前捕獲資料包,所以即使tcpdump能夠捕獲這些資料包,它們也很可能被防火墻阻擋,并且從未在套接字上收到。
此外,在一個繁忙的回圈中呼叫recv可能會在大多數時候回傳EAGAIN,因為大多數時候套接字上沒有資料可用。非阻塞的套接字通常與檢測套接字活動的東西一起使用,如果沒有活動就會阻塞,即select, poll, kqueue, ... 。結合這些機制可以在一個單執行緒中處理許多套接字。在一個單一的套接字上使用一個繁忙的回圈,幾乎沒有意義。
uj5u.com熱心網友回復:
這都是因為docker主機網路在OSX上不作業,所以我在容器內運行的應用程式無法接收從主機發送的UDP資料包。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332806.html
標籤:
