Windows插座理解RECV并发送
Windows Sockets understanding recv and send
我在这里有点混乱,说我这样做:
send(serverSocks, "Size: 1348", strlen("Size: 1348"), 0)
,然后是这样:
send(serverSocks, "SomeDataThatIs1348LongAndThatNeedsToBeSent", strlen("SomeDataThatIs1348LongAndThatNeedsToBeSent"), 0)
由于它们是连续发送的,因此当我做类似:
的事情时,我有可能只收到它。 recv(clientSocks, buf, 2000, 0)
对吗?
我将如何从服务器端收到它?还是我什至需要客户端首先将大小发送到服务器?否则我甚至不知道大小不知道整个数据?
编辑:
也许我需要更清楚我的问题。我该如何说这些数据是客户发送的第一个(或第二个)数据的一部分?
由于它们是连续发送的,因此当我做类似:
的事情时,我有可能只收到它。recv(Clienterocks,Buf,2000,0)
对吗?
是。
我将如何从服务器端收到它?
您必须以接收者知道一条消息结束并下一步开始的方式构架每个消息。您可以:
-
在发送消息的数据之前发送消息的长度。然后,接收器可以先读取长度,然后读取遵循长度的特定数字。
-
在每个消息的末尾附加一个唯一的定界符,这些内容将永远不会出现在消息数据本身中,例如ETX字节,空终止符,换行式断路等。接收器可以读取字节直到到达定界符为止。
还是我甚至需要客户端首先将大小发送到服务器?否则我甚至不知道大小不知道整个数据?
TCP是流媒体传输,它没有消息边界的概念,因此您必须在传输数据本身中处理它。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 控制允许动态运行c++的并发操作数
- 节俭并发:未解决的外部问题
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 用于在并发环境中访问 MMIO 的软件模式
- Linux 服务器中的 Recv 缓冲区大小
- 在 for 循环中处理复杂的发送 recv 消息
- C++中的并发哈希表
- 提升 asio 并发计时器取消问题与链
- C++具有基元类型的并发队列
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 使用简单两相锁定的并发程序
- C++ 按引用或值推送的并发队列
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- 由并发无序映射查找线程调用的函数是否安全?
- 为什么套接字中的 recv() 函数不返回任何内容?
- 在迭代期间并发修改映射
- 并发安全堆栈接口方法:正确与否?