C++ socket读端读取连接的所有消息

问题描述:

嗨,我有一个使用C#套接字服务器和C++套接字客户端的套接字编程。C++ socket读端读取连接的所有消息

服务器我用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 实际: 而processMessage(msg1msg2msg3 ... MSG10);

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

+0

你必须记住,TCP是一个流媒体协议,没有开始或结束的流,数据只是流动。如果你需要分离消息,你必须自己做。 –

+0

例如,IRC使用'\ r \ n'(回车,然后换行)来分隔消息。 – Mgetz

简单 - TCP无法传输超过一个字节的任何消息 - 它是一个八位字节/字节流。

如果您想传输长度超过一个字节的消息,则需要TCP上的另一个协议。

+1

..是的,我知道这是一个多重复制,但比找到二人组更容易回答。 –

+1

我宁愿杀掉所有这些问题,并将它们指向TCP常见问题解答。我可以告诉OP没有使用recv的返回值,尽管他没有发布相关的代码!这不是令人沮丧吗?!总是一样的错误。我可以创建一个脚本,向所有新的TCP问题发布相同的消息,并且50%的时间是正确的。 – usr

以这种方式工作是正常的。您可以自行定义分割数据的协议,例如,您可以选择以4个字节开始传输,告诉您传输的时间。