c++ - send() 没有传送所有字节?

标签 c++ networking tcp byte winsock

为什么 winsock 中的 send() 不能保证传送您请求的所有字节?

这是 TCP,它正在阻塞套接字。

同样,这发生在非阻塞时。你怎么能保证你发送的一切?

我注意到 recv() 也有同样的作用。

最佳答案

如果它没有发送所有内容,只需再次调用 send 即可。如果阻塞,您可以立即执行。如果是非阻塞的,您可以等待或使用套接字发现方法(如 select 或 I/O 完成端口)。 recv 也是如此。如果您没有得到所有想要的,请再次调用 recv。这是 recvsend 都返回发送或接收的字节数的原因之一。

您传递给sendrecv 的字节数只是一个限制。它可以发送少于那个(尽管,除非非阻塞,通常不会)。但它绝对可以收到少于那个。 (操作系统无法控制它接收的数据量或接收数据的时间。)

TCP 已为您实现。但是,如果您有涉及应用程序级消息的应用程序协议(protocol),则应用程序必须实现它们。它不会通过魔法发生。 TCP 不会将字节“粘合在一起”为您发送消息。 TCP是字节流协议(protocol),不是消息协议(protocol)。如果你想要消息,你必须实现它们。

关于c++ - send() 没有传送所有字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399691/

相关文章:

c++ - 为什么 OpenCV 程序捕获视频帧会在几秒钟后卡住?

c++ - 当我执行 C++ 程序时如何设置 VSCode 屏幕不会立即消失

c++ - 使用 IOCP 的 TCP/IP 服务器。接收缓冲区中的偶尔数据损坏

node.js - NodeJS api - "net"在客户端

c++ - 等待所有线程完成一项工作然后再做另一项

构建的c++问题

ios - 将信号从 iPhone 发送到微 Controller

Java:服务器/客户端 -> 客户端/客户端

networking - TCP PSH 是如何工作的?

c# - TCP 服务器到客户端