2011-12-05 32 views
0

我正在编写我自己的TCP客户端,它有点奇怪。TCP代理怪异

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

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

我该如何解决这个问题?

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

+1

最好是,如果你能重现二三十行的问题......也许只是包括显示你如何发送和接收流的片段。 – sarnold

回答

2

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

那么,Windows内核实际上是在对抗你,因为它试图尽可能地连接数据包。如果您想要禁用此(这就是所谓的Nagle算法)从正在发送数据的一侧:

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

但TCP将始终代表一个流,所以你应该为它准备。

就你而言,这意味着你应该解析返回的字符串,找到所有'\0'并为它们中的每一个发送一个事件。

5

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

0

此:

如果我试图在同一时间发送2串

然而,奇怪的事情发生了。

alöready有解决方案。不要同时发送它们。排队第二个字符串,s在第一个字符串之后结束。这是btw。完全不是网络问题 - 套接字API在每个定义中不是原子和线程安全的。

2

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

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

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

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

+1

我会补充说TCP是一个流协议:连续调用send()并不意味着来自'recv()'的多个返回值,因为数据可能被附加到一个单独的tcp帧中。数据被认为是一个连续的字节流,您负责自行分离流的不同部分。 –