UDP 클라이언트의 포트 정보
안녕하세요. UDP 프로그램에 관하여 질문드립니다.
상황을 설명드리자면..
메인 호스트가 있습니다.(서버)
그리고 두개의 클라이언트가 있습니다.(C1, C2)
C1이 서버로 최초 sendto를 하면 서버는 recvfrom후에 sockaddr구조체의 sin_port를 참조하여
C1의 로컬 포트를 알아냅니다.(50000번이라고 가정합니다.)
서버는 이 포트 정보를(50000번) C2에게 알려줍니다.
여기서, C2가 50000번으로 C1에게 sendto를 하면 전송이 되질 않습니다.
하지만 서버는 가지고 있는 소켓 정보로 C1에게 정상적으로 메세지를 전송할 수 있습니다.
그런데, 우연히 lsof 명령으로 C1에 대한 정보를 보던중에 다음 정보를 발견했습니다.
C1 21435 chulsoo 3u IPv4 1629645 UDP *:30000
혹시나 하는 마음에 C2에서 30000번으로 C1에게 sendto를 하니 정상 작동하였습니다.
이런 상황인데요...
질문 1. 50000번으로 C1에게 sendto를 하면 안되고, 30000번으로 해야되는 이유가 무엇인가요?
질문 2. 서버가 C1의 포트 정보를 30000번으로 정확하게 알아내는 방법은 무엇인가요?
질문 3. 이 두 포트가 정확이 무슨 포트들인가요?
장황한 설명 읽어주셔서 감사드리구요,
작은 답변이라도 꼭좀 부탁드리겠습니다. ㅜ_ㅡ
즐거운 추석 되세요~~
udp 포트
*:30000 번이라고 뜨는건 30000번 포트에 bind 했다는 뜻인데,
sendto 할때 bind한 소켓을 이용해서 보내시는지요? 다른 소켓을
통해서 보낸다면 포트가 바뀌겠죠.
--
http://mix1009.net
예를 드느라
예를 드느라 30000번이라고 썼지만 C1에서 bind는 하지 않았습니다. 32113정도의 임의로 배정받은 포트였습니다.
----
jai guru deva om...
----
jai guru deva om...
네트워크가?
클라이언트가 모두 NAT 밖에 있는지요?
--
http://mix1009.net
아 아닙니다.. 세
아 아닙니다.. 세 프로그램 모두 동일한 머신에서 로컬호스트로 실행했습니다.
----
jai guru deva om...
----
jai guru deva om...
ntohs(port)
포트 번호 읽을때, byte order 처리를 안해주신거 같네요. ntohs(port)
--
http://mix1009.net
나이가 들수록 점점
나이가 들수록 점점 바보가 되가는 느낌입니다. ㅋㅋ
바이트오더 문제 맞았습니다. 답변 정말 감사드려요.. ^^/
----
jai guru deva om...
http://peccavi.net
----
jai guru deva om...
UDP 클라이언트 프로그램.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
recvfrom() 펑션은 클라이언트 프로그램이 데이터를 전송할때 서버의 수신 포트와 클라이언트 자신의 수신하고자하는 로컬포트를 정의하여 데이터를 전송합니다.
서버는 udp데이터를 받게 되면 클라이언트의 ip와 클라이언트의 바인드 포트를 추출하여 sendto()펑션을 이용하여 전송하게 됩니다.
수신된 udp 패킷에서 클라이언트의 수신 포트를 알수 있습니다.
그리고 반드시 클라이언트를 속켓 생성시 로컬포트를 바이드(bind)하여 주어야 합니다.
바인드를 않으면 클아이언트는 전송만하고 수신은 하지 않습니다.
로컬포트를 임의로 설정하지 않는 경우는 클라이언트 컴퓨터의 사용하고 있지 않은 포트가 자동으로 설정되는 것으로 생각됩니다.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
댓글 달기