我正在开发一个测试套件,在这个测试套件中,Python程序启动并测试一个C#程序,并在测试结束后终止它。 C#程序一次又一次地启动(所以启动,测试,杀死,启动,测试,杀死等)。
C#程序有一个TCP服务器,Python连接到它并发出一些要测试的动作。
然而,数据有时会丢失。我已经捕获了TCP数据并通过代码进行了调试,但找不到确切的原因。转储对我来说很奇怪,也许你可以帮忙吗?
最多773帧显示一个测试(端口49xxx上的Python,2000上的C#)。交换数据,然后Python关闭771上的连接。这部分工作。
我不知道为什么RST是在773发送的,但我不是tcp专家。
从774开始,C#应用程序已重新启动,Python尝试连接到它。这看起来很奇怪。数据在779和781中发送,但不会出现在C#中。
这里我的应用程序挂起,Python等待响应,C#等待数据泄露。
答案 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之间接受连接请求,则代码会被卡住。