我正在编写我自己的TCP客户端,它有点奇怪。TCP代理怪异
客户端的工作方式是检查接收到的字节的最后一个字节是否为\ 0字符。如果是,它将缓冲区中的以前的数据转换为文本,并触发一个包含该文本的事件作为事件的参数。
但是,如果我尝试同时发送2个字符串,会发生一些奇怪的事情。在这种情况下,他们实际上是作为一个字符串接收的,如果你问我,这很奇怪。
我该如何解决这个问题?
我没有包含代码示例,因为它包含的内容相当大。如果您坚持,请添加评论并提出要求,然后发布。
我正在编写我自己的TCP客户端,它有点奇怪。TCP代理怪异
客户端的工作方式是检查接收到的字节的最后一个字节是否为\ 0字符。如果是,它将缓冲区中的以前的数据转换为文本,并触发一个包含该文本的事件作为事件的参数。
但是,如果我尝试同时发送2个字符串,会发生一些奇怪的事情。在这种情况下,他们实际上是作为一个字符串接收的,如果你问我,这很奇怪。
我该如何解决这个问题?
我没有包含代码示例,因为它包含的内容相当大。如果您坚持,请添加评论并提出要求,然后发布。
TCP是一个流,所以当你从连接的一端发送多个数据包时,你所描述的是完全正常的,另一端可能同时收到一些事情。
那么,Windows内核实际上是在对抗你,因为它试图尽可能地连接数据包。如果您想要禁用此(这就是所谓的Nagle算法)从正在发送数据的一侧:
TcpClient client = // something
client.NoDelay = true;
但TCP将始终代表一个流,所以你应该为它准备。
就你而言,这意味着你应该解析返回的字符串,找到所有'\0'
并为它们中的每一个发送一个事件。
如果你从两个不同的线程在同一个套接字上传输两个字符串,那么是的,它们将被交织。为此,您需要某种线程同步(在.NET中,lock()
语句应该这样做),或者使用两个不同的套接字。
此:
如果我试图在同一时间发送2串然而,奇怪的事情发生了。
alöready有解决方案。不要同时发送它们。排队第二个字符串,s在第一个字符串之后结束。这是btw。完全不是网络问题 - 套接字API在每个定义中不是原子和线程安全的。
我可能是错的,但我怀疑你实际发送的字符串没有null(\ 0字符)。
当您的客户端收到数据时,它会自动追加空字符来构造一个字符串。
因此,当您同时发送2个字符串时,它们会合并在一起,而不会出现空字符。在接收端,它被重建为只有一个空值的单个字符串。
尝试使用len + 1发送数据,或在发送之前用空字符填充字符串。
我会补充说TCP是一个流协议:连续调用send()并不意味着来自'recv()'的多个返回值,因为数据可能被附加到一个单独的tcp帧中。数据被认为是一个连续的字节流,您负责自行分离流的不同部分。 –
最好是,如果你能重现二三十行的问题......也许只是包括显示你如何发送和接收流的片段。 – sarnold