如果我在Linux中的非阻塞tcp套接字上使用send(),它將返回EAGAIN用於除發送緩衝區滿狀態以外的其他任何事情嗎?EAGAIN是否會返回發送緩衝區已滿以外的任何內容?
我基本上需要決定是否要使用套接字發送緩衝區作爲我的應用程序的唯一緩衝區,或者如果我需要我自己的用戶空間緩衝區來提供套接字緩衝區。
如果我在Linux中的非阻塞tcp套接字上使用send(),它將返回EAGAIN用於除發送緩衝區滿狀態以外的其他任何事情嗎?EAGAIN是否會返回發送緩衝區已滿以外的任何內容?
我基本上需要決定是否要使用套接字發送緩衝區作爲我的應用程序的唯一緩衝區,或者如果我需要我自己的用戶空間緩衝區來提供套接字緩衝區。
它不應該,但我不明白這是如何影響你的決定關於用戶空間緩衝這樣或那樣。無論您獲得EAGAIN的具體原因如何,您都需要一個緩衝區,具體取決於您的應用正在做什麼。
您也可以考慮在做一些計算後,用SO_SNDBUF選項更改tcp緩衝區大小,使用setsockopt來查看它是否確實是性能優勢。
如果我在Linux的非阻塞tcp套接字上使用send(),它會返回EAGAIN作爲發送緩衝區滿狀態以外的任何東西嗎?
在非阻塞套接字上應該只有條件,因爲send()只在發送緩衝區滿時阻塞。
否則,我會建議不要依賴於我的經驗行爲EAGAIN有時在內核中的某些次要失敗時返回,但套接字仍然正常。由於顯然內核內存不足,我最近在EAGAIN返回時使用了HP-UX的經驗。由於錯誤是可恢復的,EAGAIN是可接受的錯誤代碼。
當未確認的數據包數量達到擁塞窗口時,EAGAIN/EWOULDBLOCK也可以返回(對於TCP套接字)。
檢查套接字w.r.t.的狀態。擁塞窗口,那麼試試這個:
#include <netinet/tcp.h>
static void print_tcp_cwnd(int socket)
{
struct tcp_info tcp_info;
uint tcp_info_length = sizeof(tcp_info);
if (getsockopt(socket, SOL_TCP, TCP_INFO, (void *)&tcp_info, &tcp_info_length) == 0)
{
printf("tcpi_snd_cwnd: %u, tcpi_unacked: %u\n",
tcp_info.tcpi_snd_cwnd,
tcp_info.tcpi_unacked
);
}
}
如果tcpi_unacked == tcpi_snd_cwnd
然後發送()將返回EAGAIN/EWOULDBLOCK對於非阻塞插座。
另請參閱:http://linuxgazette.net/136/pfeiffer.html – Bjarni 2015-04-30 13:51:37