保持插座打开一次&多次发送/接收消息

时间:2011-06-24 16:45:12

标签: c# sockets tcp

问题

我有一个C#应用程序从套接字客户端接收stream,在检索流后我需要接受客户端发送的另一个stream

当前代码

   int length= this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);

 // saves the first file ..... 

   length= this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);

详情

我确定即时通讯从套接字客户端写入数据,但在第一个文件收到第二个DataSocket.Receive 挂起并且没有收到stream之后...任何想法?

1 个答案:

答案 0 :(得分:3)

隔离的网络流 没有自动隔离消息 - 它只是字节。因此,有必要手动拆分; 最方便的是在记录之间使用已知的分隔符。最方便的读取方法是在每条消息前面加上下一条消息中要读取的字节数。

您需要使用此信息来阅读整个消息,否则阅读会发疯。在这种情况下,我怀疑你在第一个接收中读取了两个消息 ,现在没有更多数据 - 因此阻塞(它必须阻塞,直到至少可以读取一个字节,或者它已关闭)。

另外 - 请注意,因为您阅读并不意味着您有完整的消息 - 只需至少一个字节。您通常需要循环才能收到消息。