我认为在阻塞套接字上调用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
尺寸)。
答案 0 :(得分:2)
send
将数据发送到内核,并将其放在套接字缓冲区中。如果内核用完套接字缓冲区,send
将阻塞(如果它是非阻塞的话,将失败)。
这与内核将数据发送到网络几乎没有关系。
但是,如果你杀了一个程序,它的所有套接字都被强制关闭,这将丢弃内核缓冲区中的任何未发送的数据。