簡體   English   中英

是否阻塞send()立即返回?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM