2016-11-21 13 views
1

마이크로 컨트롤러 (MSP432)에서 응용 프로그램을 실행하고 있는데, 데이터를 이더넷 케이블에 쓰고이를 PC로 보냅니다.MODBUS TCP 패킷 수신을 위해 포트 번호는 어떻게 작동합니까?

패킷 송신기를 사용하여 MC에서 PC의 포트 (502)에 수신 된 데이터를 봅니다. Data received on PC

위 그림에서 알 수 있듯이 MC의 포트 번호는 전송 된 모든 패킷에 대해 증가합니다. 최대 개수에 도달하면 어떻게됩니까? 다른 포트 번호에서 다시 시작하고 프로세스를 계속 진행합니까? 아니면 중지됩니까?

EDIT1 : 내가 MODBUS를 통해 보낼 수있는 새로운 데이터가이 기능을 매번에 전화 걸기 : Modbus 프로토콜 라이브러리는 http://myarduinoprojects.com/modbus.html

Edit2가에서 사용. Mb.Req (MB_FC_WRITE_MULTIPLE_REGISTERS, 0,11,0);

if (MbmClient.connect(ServerIp,502)) { 
    digitalWrite(GREEN_LED, HIGH); 
#if DEBUG 
    //Serial.println("connected with modbus slave"); 
// Serial.print("Master : "); 
    for(int i=0;i<MbmByteArray[5]+6;i++) { 
    if(MbmByteArray[i] < 16){ 
    //Serial.print("0"); 
    } 
    //Serial.print(MbmByteArray[i],HEX); 
    if (i != MbmByteArray[5]+5) { 
    //Serial.print("."); 
    } else { 
    //Serial.println(); 
    } 
    } 
#endif  
MbmClient.write(MbmByteArray,13+(Count*2)); 

MbmCounter = 0; 
MbmByteArray[7] = 0; 
MbmPos = Pos; 
MbmBitCount = Count; 

*state= true; 
MbmClient.stop(); 
delay(100); 
digitalWrite(GREEN_LED, LOW); 
} else { 

    *state= false; 
    MbmClient.stop(); 
} 
+0

모든 TCP 메시지를 볼 수있는 방법이 있습니까? 3 방향 핸드 셰이크 포함? MC에서 어떻게 메시지를 보냅니 까? TCP 소켓 사용? 또는 TCP 메시지가 포함 된 IP 데이터 그램을 포함하는 이더넷 프레임을 보내고 있습니까? – rodolk

+0

IP 주소 (PC의 이더넷 IP), 포트 번호를 사용하여 연결했습니다. 그게 뭐냐고 묻는거야?. – JKV

+0

메시지 당 새로운 연결을 사용하고있는 것처럼 보입니다. 이것은 매우 열악합니다.포트 번호가 랩 어라운드되거나 너무 빨리 사용되면 클라이언트는 바인드 오류를 갖게됩니다. – EJP

답변

0

그것은 당신이 내가 그와 함께 일한 적이있다 this Modbus example 을 사용하는 것 같다하지만 난 코드의 대상 포트가 동일하기 때문에 당신이 your sniffing image에 있다고 가정 : 당신이 반복적으로 호출하는 아마 502

이 방법

void MgsModbus::Req(MB_FC FC, word Ref, word Count, word Pos) 

이 라인을 볼 수있는이 방법 내부 :

if (MbmClient.connect(ServerIp,502)) { 
... 

그래서이 함수를 호출 할 때마다 새 연결이 열립니다. 소켓을 통해 연결을 열면 운영 체제 또는 네트워크 스택에서 TCP 메시지가 전송되는 원본 포트 및 IP 주소를 선택해야합니다.

이 때문에 항상 새 원본 포트가 표시되고 해당 포트가 증가하는 것입니다. 임시 포트라고하는 것입니다. 사용중인 TCP 스택이 원본 포트를 선택하는 방법은 구현에 따라 다르지만 일부 포트로 시작하는 것이 일반적이며 연결이 열릴 때마다 다음 사용 가능한 포트가 선택됩니다.

스택이 잘 프로그래밍되어 있으면 대부분의 TCP 스택이 랩 어라운드되어 1024 개의 특정 포트로 시작됩니다 (처음 1024 개의 포트가 제한됨). 내가 본 코드는이 기능으로 포트를 닫는 것 같습니다. 사용 후 포트를 닫아야하는지 확인해야합니다. 포트를 닫아야합니다. 그렇지 않으면 사용 가능한 포트가 부족해질 수 있습니다 (리소스 유출). 당신이 당신의 소켓이 특정 소스 포트에 바인딩하려면

, 당신은 지금 Linux socket bind

유사한 기능을 사용해야 현명한 방법은 항상 동일한 연결을 사용하는 것입니다. 이 예제를 수정해야 할 수도 있습니다.

+0

원래 게시물에 코드를 추가했습니다. 그래서 ** MbmClient.connect (ServerIp, 502) **를 호출하여 연결을 만들 때마다 연결을 닫습니다. 그렇다면 매번 다른 포트에 계속 연결되는 이유는 무엇입니까? 동일한 포트 접근 방식을 계속 사용하는 방법에 대해 안내해 줄 수 있습니까? 감사합니다 – JKV

+0

@ JanakVarma, 응용 프로그램이 연결을 시작할 때마다 [임시 포트] (https://en.wikipedia.org/wiki/Ephemeral_port)를 선택합니다. 이것은 무작위로 선택되는 경우가 많지만 TCP 구현은 그렇게하지 않는 것처럼 보입니다. 응용 프로그램이 TCP에 원본 포트를 선택하도록 요청하고 있습니다. TCP를 포트로 선택하기보다는 TCP를 사용할 포트를 지정해야합니다. –

+0

@JanakVarma, 내 응답은 항상 다른 소스 포트를 사용하는 이유를 설명하는 것이 분명하다고 생각합니다. 동일한 대상 포트 502에 항상 연결됩니다. 더 명확하게하기 위해 더 많은 표현을 추가했습니다. Ron Maupin의 의견을보고 그가 제공 한 링크를 읽을 수도 있습니다. – rodolk