TCP表现得很奇怪
本文关键字:TCP | 更新日期: 2023-09-27 18:16:44
我正在编写自己的TCP客户端,它的行为有点奇怪。
客户端的工作方式是检查接收字节的最后一个字节是否为 ''0 字符。如果是,它将缓冲区中的先前数据转换为文本,并使用该文本作为事件的参数触发事件。
但是,如果我尝试同时发送 2 个字符串,就会发生一些奇怪的事情。在这种情况下,它们实际上被接收为一根字符串,如果你问我,这很奇怪。
我该如何解决这个问题?
我没有包括代码示例,因为它会很大。如果您坚持,请添加评论并请求它,我会发布它。
如果您从两个不同的线程通过同一套接字传输两个字符串,那么是的,它们会交错。为此,您需要某种线程同步(在 .NET 中,lock()
语句应该执行此操作(,或使用两个不同的套接字。
TCP 是一个流,所以当你从连接的一端发送多个数据包时,你所描述的是完全正常的,另一端可能会同时接收所有数据包。
好吧,Windows内核实际上正在与你作战,因为它试图尽可能多地连接数据包。如果你想从发送数据的一方禁用它(它被称为Nagle算法(:
TcpClient client = // something
client.NoDelay = true;
但是TCP将始终代表一个流,因此您应该为此做好准备。
在您的情况下,这意味着您应该解析返回的字符串,找到所有''0'
并为每个字符串发送一个事件。
我可能是错的,但我怀疑您实际上发送了没有空(''0 字符(的字符串。
当客户端收到数据时,它会自动附加空字符以构造字符串。
因此,当您同时发送 2 个字符串时,它们会合并在一起,而不会使用 null 字符。在接收端,它被重建为只有一个 null 的单个字符串。
尝试使用 len + 1 发送数据,或者在发送前用空字符填充字符串。
这个:
但是,如果我尝试同时发送 2 个字符串,就会发生一些奇怪的事情。
Alöready有解决方案。不要同时发送它们。将第二个字符串排队,在第一个字符串之后结束。顺便说一句。完全不是网络问题 - 套接字 API 只是根据定义不是原子和线程安全的。