socket udp port문제 질문드립니다.
글쓴이: 삼구의신 / 작성시간: 화, 2018/10/23 - 6:35오후
linux udp 를 사용 중입니다.
udp sendto 할때 20000번 포트로 설정해서 전송한 것을 tcpdump로 확인하면 다른 포트로 전송되고 있습니다.
하지만 받는 쪽에선 20000번 포트로 제대로 들어오구요... 이건 왜그럴가요?
tcpdump 캡쳐 드립니다. 데이터도 깨지지않고 정상적으로 들어옵니다. 저는 분명 20000번 포트로 전송했는데
아래 tcp dump에선 43777포에서 보낸다고 나옵니다. 하지만 해당 장비에는 20000번 포트로 전동되네요..
송신측 : A에서 B로 전송할 때
12.31.240.240.43777 > 12.17.0.64.20000: [udp sum ok] UDP, length 17
수신측 : B에서 Data를 받았을 때
12.31.240.240.42042 > 12.17.0.64.20000: [udp sum ok] UDP, length 17
A라는 장비에서 20000 포트로 data를 전송하려고하면 송신할때 포트번호가 바뀝니다. 왜그런지 아시는분 있나요?
조언 부탁드립니다.
udp send 부분 입니다.
int sock; struct sockaddr_in sin; if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket init error :"); return ; } memset(&sin, 0, sizeof sin); sin.sin_family = PF_INET; sin.sin_addr.s_addr = inet_addr(ipAddr.c_str()); // 12.17.0.64 sin.sin_port = htons(port); // 20000 if( sendto( sock, data, dataSize, 0,( struct sockaddr*)&sin, sizeof( sin)) != dataSize) { printf("Mismatch in number of sent bytes"); } close( sock);
Forums:
송신측 : A에서 B로 전송할 때
송신측 : A에서 B로 전송할 때
12.31.240.240.43777 > 12.17.0.64.20000: [udp sum ok] UDP, length 17
수신측 : B에서 Data를 받았을 때
12.31.240.240.42042 > 12.17.0.64.20000: [udp sum ok] UDP, length 17
20000포트로 잘 보내고 있는데요?
우편을 부쳐 보셨으면 아시겠지만 받는 사람 주소뿐만 아니라 보내는 사람 주소도 적기 마련입니다.
43777(및 42042)은 보내는 쪽 포트번호입니다.
받는 측에서 20000 포트로 잘 들어오지만, 보낸
받는 측에서 20000 포트로 잘 들어오지만, 보낸 사람의 포트는 42042 같이 랜덤으로 바뀌는 현상이 문제입니다.
수신측에서 송신자의 포트번호를 가져와 loopback 해줘야하는데 포트번호가 마음대로 바뀌니 데이터를 제대로 받을수가 없습니다.
제가 하고싶은것은
12.31.240.240.20000 -> 12.17.0.64.20000 이렇게 가도록 하고싶은것 입니다.
구글에서 socket bind port 로 검색해
구글에서 socket bind port 로 검색해 보세요. 결론은 원하는 port 번호를 가지고 생성한 소켓을 bind() 함수로 묶어 주시면 됩니다.
왜 꼭 그래야만 하는지는 알 수 없지만, (수신측에서
왜 꼭 그래야만 하는지는 알 수 없지만, (수신측에서 송신자의 포트번호를 알고 싶다면, recvform 함수를 호출하면서 src_addr를 받으면 됩니다: https://linux.die.net/man/2/recvfrom) 송신측의 포트도 원하는 대로 지정하고 싶다면 sock을 sendto 전에 미리 bind 하면 됩니다.
감사합니다^^
감사합니다^^
댓글 달기