对于 csend函数(阻塞方式),它指定了在目的地接收到时返回的函数返回的发送字节大小。我不确定我是否理解所有细微差别,在使用服务器端WSAIoctl和WSARecv在服务器端编写“演示”应用程序之后也是如此。
- 当发送返回的字节数少于缓冲区长度参数中要求的字节数时?
- 什么被视为“在目的地收到”?我的第一个猜测是它位于服务器的操作系统缓冲区并通知服务器应用程序时。我的第二个是服务器应用程序
recv调用完全阅读它的时候?
除非您使用的是(有些奇特的)库,否则send套接字上的 a 将成功返回传递给 TCP 缓冲区的字节数,而不是对等方接收到的字节数(例如,参见Microsoft 的文档)。
当您通过套接字传输数据时,您需要检查有效接受到 TCP 发送缓冲区的字节。这就是为什么通常一个发送命令在一个循环中,send如果需要的话会发出几个 s。
错误send是本地的:例如,如果套接字在发送操作期间被对等方关闭(使您的套接字无效)或操作超时(TCP 缓冲区没有清空,即对等方没有足够快地接收数据或其他一些问题)。
全部send完成后,您无法轻松知道对方是否收到了您发送的所有字节。您通常只需发出closesocket并确保您的套接字具有正确的延迟选项集(即仅在超时或成功完成发送后关闭)。或者,您等待对等方的确认(例如,通过 arecv返回零字节,表明连接已正常关闭)。
编辑:错字