[Python] 동일 시스템에서 UDP 패킷 주고 받기 Develop Tip

UDP 패킷을 성성하고 그 것을 소비하는 프로그램을
파이썬으로 간단히 구현할 수 있습니다.

UDP인 경우 send측에서는

clisock = socket(AF_INET, SOCK_DGRAM)
clisock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
clisock.bind((host, port))
clisock.sendto(msg,(host,port))

와 같이 작성하면 되고,

recv 측에서는 

svcsock = socket(AF_INET, SOCK_DGRAM)
svcsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
svcsock.bind((host, port))
svcsock.recvfrom(8192)

와 같이 작성하면 됩니다.

그러나 동일 시스템에서 위의 프로그램을 기동시키면,

Address already in use 라는 오류 발생

그 이유는 송수신 포트를 모두 동일 포트로 지정하였기 때문에
두 개 이상의 프로그램이 한 시스템 내에서 동일 포트를 bind 하려고
하였기 때문에 발생한 것이었습니다.

해결방법은
만약 패킷 송신 측에서 sendto 만 하는 경우에는 
송신측에 bind를 제거하면 두 프로그램이 모두 동작합니다.

즉 recvfrom을 하진 않은 경우에는 bind 소켓 함수 호출을 하지 않아도
sendto 가 되는 것이지요.

대신 send 측의 srcport 는 임의의 포트가 설정됩니다.
(패킷 캡쳐를 해본 결과 동일한 랜덤포트가 보내지는 것으로 확인)


어느분께는 도움이 되셨기를...

덧글

  • 나그네 2018/03/21 11:29 # 삭제 답글

    client 의 경우
    TCP 도 bind 안합니다. 그냥 connect 를 시도합니다.
    UDP 는 말할 필요도 없이 connect 는 물론 bind 도 없습니다.
댓글 입력 영역

구글애드텍스트