C# 同步套接字第二次接收()调用未返回/超时

C# 同步套接字第二次接收()调用未返回/超时,c#,sockets,synchronous,C#,Sockets,Synchronous,我有一个与LRS(远程系统)发送器通信的同步客户端套接字,它接受XML输入和TCPIP连接。我能够与设备建立连接,并在连接后收到响应;但当我试图发送一些短信并再次呼叫Receive时,没有回复或最终超时。你能解释一下原因吗 我的示例代码: Socket tcpSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); System.Net.IPAddress[] IPs = Syst

我有一个与LRS(远程系统)发送器通信的同步客户端套接字,它接受XML输入和TCPIP连接。我能够与设备建立连接,并在连接后收到响应;但当我试图发送一些短信并再次呼叫Receive时,没有回复或最终超时。你能解释一下原因吗

我的示例代码:

Socket tcpSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
System.Net.IPAddress[] IPs = System.Net.Dns.GetHostAddresses("valid_IP_address");
tcpSocket.Connect(IPs[0], PORT_NUMBER);
int nBytes = 0;
byte[] RcvBytes = new byte[BUF_SIZE];
if (tcpSocket.Connected)
{
    tcpSocket.ReceiveTimeout = 60000;   //1 minute timeout
    //connected is true and below Receive call returns some bytes
    //RcvBytes contains a valid response, ie, <LRSN services="blah, blah" ... />
    nBytes = tcpSocket.Receive(RcvBytes, 0, tcpSocket.Available, SocketFlags.None);
}

//below Send returns 8 bytes, the lenth of "SomeText"
nBytes = tcpSocket.Send(Encoding.ASCII.GetBytes("SomeText"));

//*** FAILS, below Receive call never returns, eventually time out
nBytes = tcpSocket.Receive(RcvBytes, 0, tcpSocket.Available, SocketFlags.None);
Socket tcpSocket=新套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
System.Net.IPAddress[]IPs=System.Net.Dns.GetHostAddresses(“有效IP地址”);
tcpSocket.Connect(IPs[0],端口号);
int n字节=0;
byte[]RcvBytes=新字节[BUF_SIZE];
如果(tcpSocket.Connected)
{
tcpSocket.ReceiveTimeout=60000;//1分钟超时
//connected为true,下面的Receive call返回一些字节
//RcvBytes包含有效响应,即,
nBytes=tcpSocket.Receive(RcvBytes,0,tcpSocket.Available,SocketFlags.None);
}
//下面的Send返回8个字节,“SomeText”的长度
nBytes=tcpSocket.Send(Encoding.ASCII.GetBytes(“SomeText”);
//***失败,下面的接收呼叫永远不会返回,最终超时
nBytes=tcpSocket.Receive(RcvBytes,0,tcpSocket.Available,SocketFlags.None);

我想您可能遇到了这个问题:

LRSN消息传输所有消息都基于XML。使用一些XML 在解析器中,很难处理连续的XML流。缓和 在分析传入消息时,将使用以下消息帧方案 已使用:•换行符('\n')用于分隔 消息两个换行符之间的数据应形成可解析的XML 文件(即所有标签平衡)


因此,请尝试发送一些新行。

进一步回答我的问题。接收超时后,我可以调用tcpSocket。断开连接,设备显示没有连接客户端,因此似乎仍有握手。使用wireshark或等效工具查看发送“SomeText”后是否返回任何通信量。如果没有响应,则
Receive
将按预期的方式运行。实际上,我尝试发送“”,希望返回一条指定成功或错误的消息。我还尝试向设备发送“…”文本,这是另一组有效的消息,但仍然没有响应。如果不使用数据包嗅探器确定是否有任何数据返回,很难说出问题出在哪里感谢提示。我确实试过WireShark,看起来ACK确实发回了,但len是0。发送:21125→3700[PSH,ACK]Seq=1 ACK=1 Win=65279 Len=8 Receive:3700→21125[ACK]Seq=1 ACK=9 Win=859 Len=0但我只发送下面的简单登录消息:
我将收到消息,但没有收到任何消息。发射机似乎不理解我发送的信息,完全忽略了它。有人可以请张贴一个工作样本,因为我找不到任何资源在网上。谢谢你!每个消息(包括登录消息)都必须以换行符/换行符“\n”(ASCII 10)终止。除非您发送
\n
OMG,否则您将无法收到邮件,我无法相信这就是原因!我一直在寻找更新的API文档。。。顺便说一句,我找不到。非常感谢你解决了这个神话!我试图将此标记为答案,但遇到错误。。。不确定是不是因为你是客人。再次感谢!