c++ - Windows Sockets 理解接收和发送
问题描述
我在这里有点困惑,说我这样做:
send(serverSocks, "Size: 1348", strlen("Size: 1348"), 0)
然后是这个:
send(serverSocks, "SomeDataThatIs1348LongAndThatNeedsToBeSent", strlen("SomeDataThatIs1348LongAndThatNeedsToBeSent"), 0)
由于它们是连续发送的,因此当我执行以下操作时,我有可能只收到一张:
recv(clientSocks, buf, 2000, 0)
正确的?
我将如何从服务器端接收它?还是我什至需要客户端先将大小发送到服务器?或者我可以在不知道大小的情况下接收整个数据?
编辑:
也许我需要让我的问题更清楚。我怎么知道这些数据是客户端发送的第一个(或第二个)数据的一部分?
解决方案
由于它们是连续发送的,因此当我执行以下操作时,我有可能只收到一件:
recv(clientSocks, buf, 2000, 0)
正确的?
是的。
我将如何从服务器端接收它?
您必须以这样一种方式构建每条消息,即接收者知道一条消息在哪里结束,下一条消息在哪里开始。您可以:
在发送消息数据之前发送消息的长度。然后接收器可以先读取长度,然后读取跟随长度的特定字节数。
在每条消息的末尾附加一个唯一的分隔符,该分隔符永远不会出现在消息数据本身中,例如 ETX 字节、空终止符、换行符等。然后接收方可以读取字节,直到到达分隔符。
还是我什至需要客户端先将大小发送到服务器?或者我可以在不知道大小的情况下接收整个数据?
TCP 是一种流传输,它没有消息边界的概念,因此您必须在传输的数据本身中处理这一点。
推荐阅读
- php - Nova actionable_id 不能为空
- wpf - 复杂的 WPF 组合框
- testing - 评估软件架构/测试软件属性(如“可扩展性”)的最佳方法,无需具体说明?
- c++ - qInstallMessageHandler 不接受公共方法作为参数
- html - 如何增加变换:悬停时缩放半径
- python - BalancedBatchGenerator 抛出 AttributeError model.fit_generator
- python-3.x - 为什么即使在 python-3 电子邮件解析中解码后我也会得到一个字节字符串?
- javascript - 用 classList remove 删除一个类
- regex - 有没有办法在正则表达式中的字符集之间进行选择?
- java - 使用@PreAuthorize 时,Spring SpelExpression 似乎没有读取我的 bean