只有在逐步调试代码时,Socket.Receive()才能按预期工作

时间:2017-08-31 10:11:33

标签: c# sockets tcp synchronous

我是套接字编程的新手。我有一个用C#编写的小应用程序,它使用COM端口连接到"密钥映射器"设备仅在应用程序发送匹配命令时才响应。例如:如果我需要从映射器获取一些引脚号,我发送了一个十六进制命令。然后我收到了正确的回复。现在,我尝试使用具有设备唯一IP地址的套接字连接执行相同的活动,如下所示。

private void button1_Click(object sender, EventArgs e)
{
    byte[] sendCommand = new byte[] { 0x02, 0x24, 0x31, 0x95, 0x0A, 0x0D, 0x03 };
    byte[] ReceivedVal = new byte[1024];
    IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.178.170"), 10001);
    Socket senderNew = new Socket(AddressFamily.InterNetwork,
                                  SocketType.Stream, ProtocolType.Tcp);

    waitLoop(5);
    try
    {
        senderNew.Connect(ipEndPoint);
    }
    catch(SocketException socProblem)
    {
        Console.WriteLine(socProblem.Message.ToString());
    }
    waitLoop(5);
    int test = senderNew.Receive(ReceivedVal);
    Console.Write("Starting bytes read : ");
    Console.WriteLine(test.ToString());
    waitLoop(5);

    int bytesSent = senderNew.Send(sendCommand);
    waitLoop(5);
    Console.WriteLine("Socket connected to {0}", senderNew.RemoteEndPoint.ToString());
    int bytesRec = senderNew.Receive(ReceivedVal);
    Console.Write("data bytes read : ");
    Console.WriteLine(bytesRec.ToString());
    waitLoop(5);

    QueryAllCodeResponseHandler(ReceivedVal);
    waitLoop(5);
    Console.Write("Number of Pin Codes read: ");
    Console.WriteLine(PinCodes.Length.ToString());
    senderNew.Close();
    GC.Collect();
    PinCodes = null;
    ReceivedVal = null;
    ipEndPoint = null;
    GC.Collect();
}

预期结果如下:

enter image description here

当我逐行调试时,它完全正常。但如果我直接运行它没有任何调试点或逐行跳过调试我只得到2个引脚或0个引脚。然后我尝试在尝试失败之后使用第三方应用程序写入,并意识到它从先前的尝试接收了其余的引脚。有人可以帮助我找出问题所在吗?

1 个答案:

答案 0 :(得分:2)

正如已经指出的那样,您的代码会留下一些问题,但(假设您的调试步骤是准确的)似乎您只是依靠TCP协议来决定何时收到您的回复。

您要连接的设备应使用应用程序定义的协议来查询它。例如,初始响应将包含整个响应期望的字节数,或者它将使用特定字符来指示响应的结束,有无限的方式。

正确的实现将遍历几个receive(),直到数据被完全接收(或超时到期)。

换句话说,设备似乎发送的数据比你想象的要慢得多,而且直接运行(没有调试停止)只能捕获部分响应。