【问题标题】:C++ socket reading side reads all messages concatenatedC++ 套接字读取端读取所有连接的消息
【发布时间】:2014-05-02 18:51:50
【问题描述】:

您好,我有一个使用 C# Socket Server 和 C++ Socket Client 的套接字编程。

我使用Socket.Send(bytes[])发送消息的服务器

CPP 客户端我使用recv(socket,buffer,length,flags) 但是在服务器中,如果我在客户端同时发送多条消息,我会收到所有连接的消息。

for(int i=0;i<10;i++)
{
var bytes= GetBytes("msg"+i);
theSocket.Send(bytes);
}

C++ 套接字客户端:

Thread.Start()
{
   var msg = recv(theSocketClient,buffer,1024,0);
   ProcessMessageFromSocket(msg);
}

预期是: 然后处理 msg1 处理 msg2... 处理 msg10 实际的: 进程消息(msg1msg2msg3...msg10);

我错过了什么? 我试图解决这个问题: 1. C# NetworkStream.Flush() -- 即使在这之后它给了我连接的字符串 2. CPP 每次完成读取后我都会擦除缓冲区(但实际的套接字有数据连接,所以这没有帮助)

【问题讨论】:

  • 您必须记住,TCP 是一种流协议,流没有开始或结束,数据只是流动。如果您需要在消息之间分开,您必须自己做。
  • 例如 IRC 使用\r\n(回车然后换行)来分隔消息。

标签: c# c++ c sockets winsock2


【解决方案1】:

这样工作很正常。您可以定义自己的数据拆分协议,例如,您可以选择以 4 个字节开始每次传输,告诉您传输多长时间。

【讨论】:

    【解决方案2】:

    Simples - TCP 不能传输任何长度超过一个字节的消息 - 它是一个八位字节/字节流。

    如果你想传输超过一个字节的消息,你需要在 TCP 之上的另一个协议。

    【讨论】:

    • ..是的,我知道这是一个多副本,但回答比找到副本更容易。
    • 我宁愿杀死所有这些问题并将它们指向 TCP 常见问题解答。我可以说 OP 没有使用 recv 的返回值,尽管他没有发布任何相关代码!是不是很郁闷?!总是同样的错误。我可以创建一个脚本,向所有新的 TCP 问题发布相同的消息,并且 50% 的时间都是正确的。
    猜你喜欢
    • 2015-01-28
    • 2012-01-16
    • 2018-07-11
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多