2017-11-27 72 views
0

내 문제는 내 UDP 클라이언트가 네트워크에 아무 것도 연결되어 있지 않은 것으로 연결되어 있다고보고하는 것입니다. 나는 7777의 컴퓨터 포트에서 포트 7775에서 IP 10.10.10.10을 사용하여 PLC 모듈에 연결하려고합니다. 이더넷 또는 무선 연결이 켜져 있지 않아도 클라이언트의 Connect() 기능이 작동합니다.내 UDP가 연결되지 않는다고 말하는 이유는 무엇입니까?

내 문제의 핵심은 내가 매우 이상한 행동을 얻을 연결() 명령 다음에 브레이크 포인트를 삽입하면 내가

Public Sub Connect() 
    Try 
     If (plcType = 0) Then 
      udpClient = New UdpClient(7777) 
      udpClient.Client.Connect(IPAddress, port) 
      SendCommand("ME") 
     End If 
    Catch 
     MsgBox("Could not connect to the controller, please check IP address." & vbCrLf & Err.Description) 
     'Connect() 
    End Try 
End Sub 

을 믿고 내 연결 코드를 중심으로 돌아 가지. 중단 점에 도달하면 udpClient.Client의 속성을 살펴보면 연결되어 있다고 표시되지만 그 속성을 그대로두고 다시 보면 갑자기 변경되고 연결되지 않는다고 말하고 프로그램에서 올바르게 읽습니다. 그 시점 이후에 연결되어 있지 않습니다.

이 문제는 두 번째 컴퓨터를 연결하고 같은 컴퓨터에서 동일한 프로그램을 실행하려고 시도한 후에 만 ​​나타납니다. 어느 컴퓨터도 제대로 장치와 더 이상 대화 할 수 없지만 이해할 수는 있지만 분명히 내 컴퓨터 중 하나가 장치와 통신하고 있다고 생각하는 이유를 이해할 수 없습니다. 도움 주셔서 감사합니다.

업데이트 : 모든 네트워크가 비활성화되거나 연결이 끊어 질 때만 사용 가능한 모든 연결이이 조건을 트리거합니다. 그러나 해당 IP의 네트워크에 장치가없는 경우에도 연결된 것으로보고됩니다.

+0

[**'UdpClient.Client' **] (https://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.client (v = vs.110) .aspx)는'UdpClient'와 다르게 행동 할 수있는 기본'Socket'입니다. [**'UdpClient.Connect()'method **] (https://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.connect (v = vs. 110) .aspx) 대신. –

+0

Visual Vincent 그냥 똑같은 동작을 시도했습니다. : – Sean

+3

UDP에 연결의 개념이 없습니다. 실제로 무엇을 감지하고 싶습니까 – CodeCaster

답변

2

그래서 @CodeCaster는 "UDP에 연결의 개념이 없다"고 말합니다. UDP는 비 연결 방화벽입니다. 데이터 그램을 보내면 목적지에 도달 할 것이라는 보장이 없습니다.

다양한 언어에서 사용할 수있는 "연결"작업이 다르기 때문에 "이 소켓을이 특정 주소와 포트에 사용하는 데 사용합니다"라는 의미입니다. 이 지식은 네트워크를 통해 전송되는 패킷으로 변환되지 않습니다. sendto 대신 send 함수를 사용할 수있게 해주는 것은 로컬입니다.

네트워크에 특정 IP 및 UDP 포트를 수신하는 장치가 있는지 알고 싶으면 자체 동기화 메커니즘이 필요합니다. 이 프로토콜은 기본적으로 지원하지 않습니다. 그래서 예는 다음과 같습니다

  1. 하트 비트. 원격 피어가 5 초마다 특별한 멀티 캐스트 메시지를 보냅니다. 15 초 내에 하트 비트 메시지를 수신하지 않은 경우, 원격 피어가 작동 중지되었다고 가정하십시오. 자신의 재량에 따라 숫자를 조정하십시오. 응답 에코 -

  2. , 또는 에코 요청을 핑퐁. 주기적으로 특수 데이터 그램을 원격 피어에게 보내고 응답을 기다립니다.

  3. 핸드 셰이크, 승인, 재시도 ... 필요한 채널이 강할수록 TCP를 알리는 횟수가 늘어납니다. 이것은 프로토콜을 전환하는 기호의 일종입니다!

+0

좋아요, 분명히 해두 죠. 클라이언트로부터 "connected = true"를 얻었을 때, 저에게 말하는 것은 "그 주소에 패킷을 던질 수 있습니다." 주소. – Sean

+2

UDP 소켓의 경우 "connected"는 단순히 피어 IP/포트가 소켓에 정적으로 할당되었음을 의미합니다. 이렇게하면 IP/포트를 전송할 모든 데이터 그램에 명시 적으로 지정할 필요가 없으며 인바운드 데이터 그램은 해당 IP/포트에서만 허용되므로 다른 소스의 데이터 그램은 자동으로 무시됩니다. –

+0

@RemyLebeau 데이터 그램 수신에 대한 공정한 설명! 게시물을 보내는 것만. – Vovanrock2002