TCP表现得很奇怪

时间:2011-12-05 08:50:10

标签: c# tcp

我正在编写自己的TCP客户端,它的表现有些奇怪。

客户端的工作方式是检查接收字节的最后一个字节是否为\ 0字符。如果是,则将缓冲区中的先前数据转换为文本,并触发将该文本作为事件参数的事件。

但是,如果我尝试同时发送2个字符串,会发生奇怪的事情。在这种情况下,他们实际上会收到一个字符串,如果你问我这很奇怪。

我该如何解决这个问题?

我没有包含代码示例,因为它包含的内容非常大。如果您坚持,请添加评论并提出请求,我会发布。

4 个答案:

答案 0 :(得分:5)

如果你从两个不同的线程在同一个套接字上传输两个字符串,那么是的,它们将被交错。为此,您需要某种线程同步(在.NET中,lock()语句应该这样做),或者使用两个不同的套接字。

答案 1 :(得分:2)

我可能错了,但我怀疑你实际发送的字符串没有null(\ 0字符)。

当您的客户端收到数据时,它会自动附加空字符以构造字符串。

因此,当您同时发送2个字符串时,它们会合并在一起,而不会出现空字符。在接收端,它被重建为只有一个空的单个字符串。

尝试使用len + 1发送数据,或者在发送之前使用空字符填充字符串。

答案 2 :(得分:2)

TCP是一个流,所以当你从连接的一端发送多个数据包时,你所描述的是完全正常的,另一方可能同时收到任何东西。

实际上,Windows内核实际上是在对抗你,因为它尽可能地连接数据包。如果要从发送数据的一侧禁用它(它称为Nagle算法):

TcpClient client = // something
client.NoDelay = true;

但TCP总是代表一个流,所以你应该为它做好准备。

在你的情况下,它意味着你应该解析返回的字符串,找到所有'\0'并为每个字符串发送一个事件。

答案 3 :(得分:0)

此:

  

但是,如果我尝试同时发送2个字符串,会发生奇怪的事情。

已经有了解决方案。不要同时发送它们。排队第二个字符串,s在第一个字符串之后结束。这是顺便说一句。完全不是网络问题 - 套接字API根据定义不是原子和线程安全的。