TCP/IP를 통해 하드웨어에 연결하려고합니다. VB에서이 작업을 매우 원활하게 수행했으며 C#에서 동일한 결과를 얻으려고합니다.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 속성은 여전히 참입니다. 그러나 아무 것도하지 않고 1-2 초 동안 기다리면 Connected 속성은 false가됩니다.
따라서 연결이 자동으로 끊어집니다. 그런 다음 디버거를 켜 놓고 회선을 기다리면 Wireshark에서 PC와 하드웨어간에 규칙적으로 여러 개의 Keep-Alive TCP 메시지가 전송되는 것을 볼 수 있습니다. 나는 이들이 무엇인지 고소하지는 않지만 문제를 진단하는 데 도움이 될 수 있습니다 ...
아니요, 원격 응답은 응답을 확인하지 않거나 제한 시간이 있다는 의미에서 '벙어리'입니다. 연결을 끊을 때까지 PC는 연결 상태를 유지해야합니다. 코드의 VB 버전은 완전히 동일하며 예상대로 작동하고 연결을 끊지 않습니다. 또한 연결 해제를 나타내는 전송 된 패킷이없는 것 같습니다. – sbenderli