【问题标题】:Using send() twice for sending different types of data使用 send() 两次发送不同类型的数据
【发布时间】:2012-04-29 18:33:32
【问题描述】:

我有一个客户端连接到服务器并尝试send() 一些数据。但是,我需要发送两种类型的数据,比如天气和当前时间信息(只是示例)。

问题是:在客户端我调用了两次send(),一次发送天气信息,一次发送当前时间,在服务器中我循环recv()

我的预期(并构建了我的代码)是服务器第一次调用recv() 它只会获取天气信息,而在第二次调用recv() 时,只有一次调用@987654326 @ 足以让两个数据在同一个缓冲区中接收。

虽然这可能不是问题,但我已经围绕这个假设构建了我的程序,我只是想知道是否有办法实现我想要的(我想到了两者之间的 sleep() send() 但这可能不可靠),这样我就可以节省重写代码的时间。

如果有人知道一种方法,它将为我节省相当多的时间,所以我很感激任何帮助。

【问题讨论】:

    标签: c winsock send recv


    【解决方案1】:

    除了 TCP 之上的适当消息协议之外,别无选择。 TCP 只传输八位字节流(字节)。 TCP 不能传输消息、结构、对象。

    如果您围绕 TCP 可以自行传输消息的假设构建了一个大型程序,那么您就有麻烦了。

    Sleep() 和计时器不会以任何可靠或高性能的方式工作。您必须正确执行并在 TCP 之上实现协议,例如。通过发送包含数据长度的标头或使用开始/结束字节并转义出现在数据中的任一字节。

    【讨论】:

    • 好吧,至少我知道我没有浪费我的时间,我将使用标题并重写这个。谢谢。
    • 标头提示 - 一个好的标头可能都是 ASCII 字节,例如。 [SOH]"4096"[ETX]binaryData... ,其中数据长度为 4096 字节。像这样的标头没有与之关联的字节序。所有机器都可以阅读并理解它,并且对数据大小没有合理的限制,因为它由 [ETX] 终止。
    • 字节应该是这样的:0x01 0x1000 0x03?还是需要引号?
    • 我用引号表示一个 ASCII 字符串。我的示例的逐字节字节:0x01,0x34,0x30,0x39,0x36,0x03。 ASCII 字符串不能包含 0x03 ETX,因此可以是任意长度,例如。 1 MB/1048576 字节:0x01,0x31,0x30,0x34,0x38,0x35,0x37,0x36,0x03。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2012-05-23
    • 2015-01-11
    相关资源
    最近更新 更多