我正在尝试通过TCP / IP连接到一块硬件。我在VB中做得很顺利,并试图在C#中实现相同的结果。
代码如下所示:
internal Socket connectSocket(IPEndPoint vIPEndPoint)
{
Socket lclSocket = new Socket(vIPEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
lclSocket.Connect(vIPEndPoint);
}
catch (Exception ex)
{
}
if (lclSocket.Connected)
{
string str = receiveResponse(lclSocket);
if (str.Contains(PFCommonVariables.m_strCommandDelimiter))
{
_sockets.Add(vIPEndPoint, lclSocket);
}
else
{
lclSocket.Disconnect(true);
}
}
lclSocket.ReceiveTimeout = RECEIVE_TIMEOUT;
lclSocket.SendTimeout = SEND_TIMEOUT;
return lclSocket;
}
正如我所说,这段代码与VB中的代码完全相同,在那里我可以保持成功的连接。 C#中的问题是在我对IPEndPoint进行'socket.Connect'调用之后,Connected属性显示为True。我通过Wireshark验证成功发送和接收数据。然后,我在if(lclSocket.Connected)语句中放置了一个断点。当我第一次来到这里时,Connected属性仍为True。但是,如果我在这里等待1-2秒而没有做任何事情,则Connected属性将变为false。
因此,连接会自动丢失。然后,如果我打开调试器并等待一行,在Wireshark中我看到许多Keep-Alive TCP消息在PC和硬件之间来回定期发送。我不是在起诉这些是什么,但他们可能有助于诊断问题......
答案 0 :(得分:0)
当您在lclSocket.Connected行放置断点时,您将连接到服务器。此时,服务器似乎将根据您的以下代码向您发送连接响应。您的服务器是否会在很长一段时间内没有响应该响应而断开您的连接?
对于tcp流量,您可能需要查看tcpclient类。
答案 1 :(得分:0)
我一直在深入研究这个问题,看起来Socket类的Connected属性并不一定会返回我们期望的值。我在这里找到了类似的帖子:
http://bytes.com/topic/c-sharp/answers/258127-how-use-socket-connected-property-properly
似乎可能存在半开放的状态,我怀疑我在其中。当我尝试接收从硬件发送的消息时,问题就发生了。确实来了消息,但由于另一个问题,我的接收循环没有终止。但是,由于硬件发送了消息,我相信TCP协议假设连接处于暂停状态并将Connected属性设置为false。
我认为这在VB中完全相同,但由于我的接收功能正确地在那里工作,我从未观察到连接属性的变化。当socket.Connected为false时,应该仍然可以发送消息..值得一试。