[英]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.