繁体   English   中英

TCP表现怪异

[英]TCP is acting weird

我正在编写自己的TCP客户端,它的行为有点怪异。

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

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

我怎样才能解决这个问题?

我没有包含代码示例,因为要包含的示例很大。 如果您坚持要求,请添加评论并提出要求,我将其发布。

如果要通过两个不同的线程在同一套接字上传输两个字符串,那么可以,它们将被交错。 为此,您需要某种线程同步(在.NET中,应该执行lock()语句),或使用两个不同的套接字。

我可能是错的,但我怀疑您实际上发送的字符串没有空值(\\ 0字符)。

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

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

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

TCP是一个流,因此当您从连接的一侧发送多个数据包时,您所描述的内容是完全正常的,而另一侧可能同时接收到所有错误信息。

Windows内核实际上在这方面与您进行了抗争,因为它会尽可能多地串联数据包。 如果要从发送数据的一侧禁用此功能(称为Nagle算法):

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

但是TCP将始终代表一个流,因此您应该为此做好准备。

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

这个:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM