2009-08-28 3 views
0

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 메시지가 전송되는 것을 볼 수 있습니다. 나는 이들이 무엇인지 고소하지는 않지만 문제를 진단하는 데 도움이 될 수 있습니다 ...

답변

0

나는 이것에 대해 더 깊이 파고 들었고 Socket 클래스의 Connected 속성이 반드시 우리가 기대할만한 값을 반환하지는 않는다. 여기 유사한 게시물을 발견 :

http://bytes.com/topic/c-sharp/answers/258127-how-use-socket-connected-property-properly

내가에서 오전 의심 반 개방의 상태가있을 수 있음을 보인다 내가로부터 전송되는 메시지를 수신 할 때 문제가 발생합니다. 하드웨어. 실제로 메시지가 오지 만 다른 문제로 인해 수신 루프가 종료되지 않습니다. 그러나 하드웨어가 메시지를 보냈으므로 TCP 프로토콜은 연결이 중단 된 것으로 가정하고 Connected 속성을 false로 설정합니다.

VB에서 정확히 동일한 현상이 발생한다고 가정하겠습니다. 그러나 수신 된 함수가 올바르게 거기에 있었기 때문에 Connected Property에서 변경 사항을 본 적이 없었습니다. socket.Connected가 false 일 때 여전히 메시지를 보낼 수 있어야합니다. 체크 아웃 할 가치가 있습니다.

0

lclSocket.Connected 줄에 중단 점을 넣으면 서버에 연결됩니다. 이 시점에서 서버는 다음 코드를 기반으로 연결 응답을 보냅니다. 충분한 시간 내에 응답에 응답하지 않으면 서버가 연결을 끊을 예정입니까?

또한 tcp 트래픽의 경우 tcpclient 클래스를 살펴볼 수 있습니다.

+0

아니요, 원격 응답은 응답을 확인하지 않거나 제한 시간이 있다는 의미에서 '벙어리'입니다. 연결을 끊을 때까지 PC는 연결 상태를 유지해야합니다. 코드의 VB 버전은 완전히 동일하며 예상대로 작동하고 연결을 끊지 않습니다. 또한 연결 해제를 나타내는 전송 된 패킷이없는 것 같습니다. – sbenderli

관련 문제