阻塞send()会立即返回吗?

时间:2015-02-28 03:17:08

标签: c++ windows sockets winapi network-programming

我认为在阻塞套接字上调用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尺寸)。

1 个答案:

答案 0 :(得分:2)

send将数据发送到内核,并将其放在套接字缓冲区中。如果内核用完套接字缓冲区,send将阻塞(如果它是非阻塞的话,将失败)。

这与内核将数据发送到网络几乎没有关系。

但是,如果你杀了一个程序,它的所有套接字都被强制关闭,这将丢弃内核缓冲区中的任何未发送的数据。