Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 只有在逐步调试代码时,Socket.Receive()才能按预期工作_C#_Sockets_Tcp_Synchronous - Fatal编程技术网

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

C# 只有在逐步调试代码时,Socket.Receive()才能按预期工作,c#,sockets,tcp,synchronous,C#,Sockets,Tcp,Synchronous,我是socket编程的新手。我有一个用C#编写的小应用程序,它使用COM端口连接到“密钥映射器”设备,该设备仅在应用程序发送匹配命令时才会响应。如果我需要从映射器获取一些pin码,我会发送一个十六进制命令。然后我收到了正确的回复。现在,我正尝试使用具有设备唯一IP地址的套接字连接执行相同的活动,如下所示 private void button1_Click(object sender, EventArgs e) { byte[] sendCommand = new byte[] { 0x

我是socket编程的新手。我有一个用C#编写的小应用程序,它使用COM端口连接到“密钥映射器”设备,该设备仅在应用程序发送匹配命令时才会响应。如果我需要从映射器获取一些pin码,我会发送一个十六进制命令。然后我收到了正确的回复。现在,我正尝试使用具有设备唯一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();
}
预期结果如下:


当我一行一行地调试它时,它工作得非常好。但是如果我直接运行它而没有任何调试点,或者逐行跳过调试,我只得到2个引脚或0个引脚。然后,我尝试在这次尝试失败后使用第三方应用程序写入,并意识到它从上次尝试中接收了其余的PIN。有人能帮我找出问题所在吗?

正如前面所指出的,您的代码留下了一些问题,但是(假设调试步骤是准确的),您似乎只是依靠TCP协议来决定何时接收到响应

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

正确的实现将在几个receives()之间循环,直到数据完全接收(或超时过期)


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

为什么要这样做:
byte[]ReceivedVal=new byte[1024]?只需使用您发布的协议(作为图像)<代码>字节[]ReceivedVal=新字节[12]正如您在参考源
套接字中看到的。Receive
方法调用本机函数,该函数将等待缓冲区(
1024字节)被填满。因为我收到的结果是十进制的。根据协议,我接收的不仅仅是管脚,还有一些在解码过程中必须移除的分隔符。这并不是我可以为设备提供的唯一命令。您可以显示包含一组
控制台.WriteLine
s的代码。然后显示您所说的正确的预期输出,但它不包括代码正在写入控制台的任何字符串。您显示的输出是在代码中的何处生成的,一点也不清楚。其他任何人都无法知道您未显示的代码中发生了什么。阅读,谢谢你的提示。我必须添加线程。发送和接收后睡眠(300)使其工作!