Socket.Receive()的作品,因为只有一步
调试代码一步当我在socket编程新手预期。我有一个用C#编写的小应用程序,它使用COM端口连接到“密钥映射器”设备,该设备仅在应用程序发送匹配命令时才会响应。例如:如果我需要从映射器获取一些PIN码,我发送了一个十六进制命令。然后我收到正确的回复。现在我正在尝试使用套接字连接和设备的唯一IP地址执行相同的活动,如下所示。Socket.Receive()的作品,因为只有一步
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个引脚。然后,我试图在尝试失败后使用第三方应用程序写入,并意识到它从前一次尝试中收到其余引脚。有人能帮我发现问题在哪里吗?
前面已经指出的那样,你的代码留下了一些问题,但(假设你的调试步骤是正确的),似乎你只是依靠TCP协议完成后收到您的回复来决定。
您要连接的设备应该使用应用程序定义的协议来允许查询它。例如,初始响应将包含整个响应的字节计数,或者它将使用特定的字符来指示响应的结束,有无限的方式。
正确的执行将循环通过多个接收(),直到数据被完全接收(或超时)。
换句话说,该设备似乎发出比你想象的要慢得多数据直馏(无调试站)将正好赶上一个部分反应。
感谢您的提示。我必须在发送和接收之后添加Thread.sleep(300)才能使其工作! – Isuru
你为什么这样做:'的byte [] ReceivedVal =新的字节[1024]'? ''byte [] ReceivedVal = new byte [12];''''''''''''''''''''''''''''''''''' (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx)函数,它将等待缓冲区(在您的情况下为“1024字节”)被填充。 –
因为我收到十进制的结果。根据协议,我不会收到只有引脚,但我需要在解码过程中删除一些其他分隔符。这不是我可以使用该设备的唯一命令。 – Isuru
您显示的代码中有一堆'Console.WriteLine'。然后显示您所说的预期输出是正确的,但它不包含任何代码写入控制台的字符串。在代码中,你*显示的输出是在哪里产生的,这完全不清楚。没有其他人可以告诉你没有显示的代码中发生了什么。阅读[问] –