[英]Can a socket be made non-blocking only for the recv() function?
我希望能夠在不必阻塞的情況下調用recv()
,因此我希望將其設置為非阻塞,但我不希望它在發送數據時不阻塞。 那么套接字是否可以僅對recv()
函數進行非阻塞,或者阻塞/非阻塞模式是否會影響所有套接字函數?
對於Windows,您可以使用ioctlsocket()
將套接字設置為非阻塞模式。 不幸的是,這些設置適用於套接字上的所有操作。 因此,對於您的情況,您將不得不在接收和發送之間切換它。
對於記錄:對於linux,您可以在recv()
調用參數中使用MSG_DONTWAIT
標志。 單個呼叫將是非阻塞的。
沒有辦法只為recv()
函數使套接字無阻塞。
然而,有一些接近(但有缺陷),這是通過使用帶有FIONREAD
標志的ioctlsocket()
。 例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);
此函數將返回(立即無阻塞)可讀取的字節數,雖然不太准確(但我們不關心這一點,因為我們使用它來知道是否有數據需要讀取而不知道究竟有多少字節)。
正如我剛才所說,這種方法是有缺陷的,當另一端已經斷開,因為它不會告訴你,因為recv()
返回0
上斷開,而這個函數會返回0
,如果沒有數據可用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.