阻塞模式下的Linux TCP套接字

阻塞模式下的Linux TCP套接字,linux,sockets,tcp,network-programming,network-protocols,Linux,Sockets,Tcp,Network Programming,Network Protocols,在阻塞模式下创建TCP套接字并使用send(或sendto)函数时,函数调用何时返回 它是否必须等到套接字的另一侧接收到数据?在这种情况下,如果互联网上出现交通堵塞,它会阻塞很长时间吗?发送方和接收方(可能还有中间方)都会缓冲数据 成功发送数据并不保证接收端已接收到数据 通常写入阻塞套接字,只要发送端缓冲区中有空间,就不会阻塞 一旦发送方的缓冲区已满,则写操作将被阻塞,直到其中有空间容纳整个写操作 如果写入部分成功(接收器关闭套接字、关闭套接字或发生错误),则写入返回的字节可能比预期的少。后续写

在阻塞模式下创建TCP套接字并使用
send
(或
sendto
)函数时,函数调用何时返回


它是否必须等到套接字的另一侧接收到数据?在这种情况下,如果互联网上出现交通堵塞,它会阻塞很长时间吗?

发送方和接收方(可能还有中间方)都会缓冲数据

成功发送数据并不保证接收端已接收到数据

通常写入阻塞套接字,只要发送端缓冲区中有空间,就不会阻塞

一旦发送方的缓冲区已满,则写操作将被阻塞,直到其中有空间容纳整个写操作

如果写入部分成功(接收器关闭套接字、关闭套接字或发生错误),则写入返回的字节可能比预期的少。后续写入操作应给出错误或返回0-此类条件在TCP套接字上是不可逆的


请注意,如果后续的send()或write()出现错误,则一些以前写入的数据可能会永远丢失。我认为没有一种真正的方法可以知道有多少数据实际到达(或被确认)。

在阻塞模式下,写操作不能返回零。要么写了什么,要么得到-1和errno。@EJP:如果对等方正常关闭连接,则write可以返回零。但异常断开连接会导致-1。@RemyLebeau TeamB否。这仅在read()和recv()上。对关闭的连接执行write()或send()操作最终将返回-1,errno==ECONNRESET。@EJP如果收到的调用shutdown(),会发生什么?@RemyLebeau TeamB当您对已被对等方关闭的连接执行写操作时,对等方必须发出一个RST,它在发送方显示为ECONNRESET。这在RFCs中定义。它不是可选的,也不依赖于平台。返回零将与所有字节都以阻塞模式传输的约定相反,或者会发出错误。