重新连接后TCP数据丢失。

时间:2017-04-12 13:50:18

标签: c# python tcp

我正在开发一个测试套件,在这个测试套件中,Python程序启动并测试一个C#程序,并在测试结束后终止它。 C#程序一次又一次地启动(所以启动,测试,杀死,启动,测试,杀死等)。

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

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

this

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

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

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

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

1 个答案:

答案 0 :(得分: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运行的时间内发出信号,则它仅返回true。

因为我已经使用了很多ManualResetEvent,所以我错过了这一点。因此,如果在BeginAcceptTcpClient和以下WaitOne之间接受连接请求,则代码会被卡住。