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每次读完后擦除缓冲区(但实际套接字有数据连接,没有帮助)
简单 - TCP无法传输超过一个字节的任何消息 - 它是一个八位字节/字节流。
如果您想传输长度超过一个字节的消息,则需要TCP上的另一个协议。
..是的,我知道这是一个多重复制,但比找到二人组更容易回答。 –
我宁愿杀掉所有这些问题,并将它们指向TCP常见问题解答。我可以告诉OP没有使用recv的返回值,尽管他没有发布相关的代码!这不是令人沮丧吗?!总是一样的错误。我可以创建一个脚本,向所有新的TCP问题发布相同的消息,并且50%的时间是正确的。 – usr
以这种方式工作是正常的。您可以自行定义分割数据的协议,例如,您可以选择以4个字节开始传输,告诉您传输的时间。
你必须记住,TCP是一个流媒体协议,没有开始或结束的流,数据只是流动。如果你需要分离消息,你必须自己做。 –
例如,IRC使用'\ r \ n'(回车,然后换行)来分隔消息。 – Mgetz