2017-04-12 142 views
0

我正在开发一个测试套件,一个Python程序启动并测试一个C#程序并在测试完成后终止它。 C#程序多次启动,一个接一个(所以启动,测试,杀死,启动,测试,杀死等)重新连接后TCP数据丢失。

C#程序有一个TCP服务器,Python连接到它并发出一些要测试的动作。

但是,数据不时会丢失。我捕获了TCP数据并通过代码进行调试,但找不到确切的原因。转储看起来很奇怪,也许你可以帮忙吗?

Wireshark Screenshot

帧至多773示出了一个测试(Python的上端口49xxx,C#2000)。数据被交换,然后Python在771关闭连接。这部分工作。

我不知道为什么RST是在773发送的,但我不是tcp专家。

从774开始,C#应用程序已重新启动,Python尝试连接到它。这看起来很奇怪。数据在779和781中发送,但不在C#中显示。

在这里,我的应用程序挂起,Python等待响应,C#等待传入数据。

+0

这可能不是问题,因为你正在本地主机上运行一切,但我会把它扔到那里。你是否以管理员身份登录?如果没有,你是否以管理员身份运行这些程序?如果您没有以管理员身份运行,我已经看到了Windows将终止来自不可信软件的网络连接的情况。 – rtaft

+0

如果您注意到跟踪中存在大量一起发生的ACK。这表明连接的接收方没有跟上发送速率。您还会注意到序列号正在重复,表示数据包正在重新发送。我会尝试增加发送数据包之前的时间。连接的接收端运行缓慢,而不是导致数据包重新发送的确认数据包。最终连接的发送方关闭,因为它没有得到分组的确认。 – jdweng

+0

也许我不明白你的意思,但我在日志中看不到一次重发。连接的两端都发送和接收,数据传输率很低。 从774开始,客户端源端口发生更改,因此它是不同的连接。 – Johannes

回答

0

猜猜我发现了这个问题。以上wireshark的输出引导了我错误的方向,即使wireshark将传输标记为红色/黑色,我认为它越多,看起来就越完美。

IAsyncResult asyncResult=null; 
while(!_abort.WaitOne(0)) 
{ 
    if(asyncResult==null) 
    asyncResult=_tcpListener.BeginAcceptTcpClient(null, null); 

    var waitResult=asyncResult.AsyncWaitHandle.WaitOne(1000); 
    if(!waitResult) continue; 

    var tcpClient=_tcpListener.EndAcceptTcpClient(asyncResult); 
    asyncResult=null; 

    _newClientHandler(tcpClient); 
} 

这是C#端处理输入连接的代码。挖掘到文档后,似乎asyncResult.AsyncWaitHandle没有内部状态。如果WaitOne在WaitOne运行时间内发出信号,则WaitOne只返回true。

因为我使用了大量的ManualResetEvents,所以我错过了这一点。因此,如果在BeginAcceptTcpClient和下面的WaitOne之间接受连接请求,则代码会卡住。

相关问题