[Q] 네트웍 프로그래밍에서 이게 가능한지 궁금합니다.
글쓴이: bsakiag / 작성시간: 월, 2009/03/09 - 3:07오후
UDP 환경입니다.
서버장비의 서버 프로세스에서 소켓을 만들고 recvfrom(...)으로 wating을 하고 packet을 기다립니다.
그런데, 서버장비에 네트웍 인터페이스가 10여개 된다고 가정해보죠.(물론 ip도 각각..)
서버 프로세스는 INADDR_ANY로 bind(..)를 하고 대기합니다.
이런 환경에서, 클라이언트에서 특정 ip로 udp Packet를 전송할 경우,
서버의 입장에서 어느 인터페이스 (즉, 어느 ip) 로 수신했는지 알수 있을지..궁금합니다.
(패킷안에 데이터의 일부로서 ip에 대한 어떤 정보나 key는 없다고 가정하고..)
간단한 예제도 설명해 주시면 정말 감사..
그럼..미리 감사를..이만..
Forums:
recvfrom()의 5번째
recvfrom()의 5번째 인자를 살펴보면 되지 않을까요?
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
제가 알고 싶은것은 client 주소가 아니라 서버 주소입니다.
어느 client가 보냈는지 그 주소를 알고 싶은게 아니라..
여러개의 server ip중 어느 ip로 수신했는지가 궁금한것입니다..
ㅇㅅㅇ...
저도 윗분과 똑같은 생각을 했는데...
어느 서버가 보냈는지 아는것은 그렇게 어렵지 않지 않나여
---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.
http://jihwankim.co.nr
여러 프로그램 소스들이 있습니다.
필요하신분은 받아가세요.
> 클라이언트에서
> 클라이언트에서 특정 ip로 udp Packet를 전송할 경우,
> 서버의 입장에서 어느 인터페이스 (즉, 어느 ip) 로 수신했는지 알수 있을지..
제가 잘 이해했는지 걱정됩니다만, server program에서 IPADDR_ANY를 썼고, packet이 들어왔을 경우, client에서 어떤 서버 address를 썼는지 server program에서 알고 싶다는 것인가요?
음.. 이 경우, IP_RECVDSTADDR이나 IP_RECVIF socket option을 쓰고, recvfrom() 대신 recvmsg()를 쓰면 됩니다만... 복잡하고, system에 따라 저 socket option을 지원하지 않을수도 있다고 합니다.
차라리 server에서 INADDR_ANY를 쓰지 말고, interface 갯수에 따라 socket fd를 만들고, fd마다 특정 address를 박아서 bind()를 호출하고, select()를 써서 recvfrom()을 하거나, fd마다 fork()해서 recvfrom()을 하는게 낫다고 합니다. 자세한 것은 "Unix Network Programming Vol 1"에서 IP_RECVDSTADDR를 인덱스에서 찾아보시길.
heavy-load가 걸린다면 select()를 쓰는 것보다, fork()해서, 각 child가 한 interface socket fd를 담당하는 것이 나을 것입니다.
저는 network programming 경험이 별로 없어서... IP_RECVDSTADDR이 Linux에서 되는지는 잘 모르겠네요. 만약 안된다면 IP_PKTINFO option에 대해서 검색해보기 바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
음...
저도 udp 는 거의 안 써봐서 아리까리하기는 한데..
결국 accept() 에서 return 한 socket_fd 에 대해서 recv 하는거일테니..
getsockname() 으로 해당 socket_fd 의 address 를 꺼내 올 수 있지 않나 생각되네요..
(tcp 에서는 그렇게 가끔 써봤는데... ㅎ~)
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기