![](/img/trans.png)
[英]Is there any reason for a blocking call to winsock send() function on Vista to return immediately?
[英]Does a blocking send() returns immediately?
我認為在send()
完所有數據之前(直到最后一個數據塊發送到發送緩沖區為止send()
在阻塞套接字上調用send()
不會返回,但是以下測試顯示了其他情況:
// buffer = "AAAAAAAA...B" (10 MB)
char *buffer = new char[10485760];
memset(buffer, 0x41, 10485760);
buffer[10485758] = 0x42;
buffer[10485759] = '\0';
// Send buffer
send(s, buffer, 10485760, 0) ;
printf("send() has returned");
因此,基本上我連接到Netcat並發送了buffer
,即使在send()
返回之后, AAAAAAAAAAAAAA...
仍然在另一端的控制台上顯示。 您可以隨時關閉發送方,發送將會停止(因此buffer
不是已經到達另一端,而是需要很長時間才能將其顯示在控制台上)。
僅當發送緩沖區為10+ MB時才有意義。
編輯: send()
的返回值為10485760
(即buffer
大小)。
send
將數據發送到內核,並將其放置在套接字緩沖區中。 如果內核用盡了套接字緩沖區,則send
將阻塞(如果未阻塞,則send
失敗)。
這與內核向網絡發送數據幾乎沒有關系。
但是,如果您殺死程序,則該程序的所有套接字都將被強制關閉,這將丟棄內核緩沖區中所有未發送的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.