[Q] 네트웍 프로그래밍에서 이게 가능한지 궁금합니다.

bsakiag의 이미지

UDP 환경입니다.

서버장비의 서버 프로세스에서 소켓을 만들고 recvfrom(...)으로 wating을 하고 packet을 기다립니다.
그런데, 서버장비에 네트웍 인터페이스가 10여개 된다고 가정해보죠.(물론 ip도 각각..)
서버 프로세스는 INADDR_ANY로 bind(..)를 하고 대기합니다.

이런 환경에서, 클라이언트에서 특정 ip로 udp Packet를 전송할 경우,
서버의 입장에서 어느 인터페이스 (즉, 어느 ip) 로 수신했는지 알수 있을지..궁금합니다.
(패킷안에 데이터의 일부로서 ip에 대한 어떤 정보나 key는 없다고 가정하고..)

간단한 예제도 설명해 주시면 정말 감사..

그럼..미리 감사를..이만..

cinsk의 이미지

recvfrom()의 5번째 인자를 살펴보면 되지 않을까요?

$ man recvfrom

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

bsakiag의 이미지

어느 client가 보냈는지 그 주소를 알고 싶은게 아니라..
여러개의 server ip중 어느 ip로 수신했는지가 궁금한것입니다..

bookgekgom의 이미지

저도 윗분과 똑같은 생각을 했는데...
어느 서버가 보냈는지 아는것은 그렇게 어렵지 않지 않나여

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

cinsk의 이미지

> 클라이언트에서 특정 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/

ymir의 이미지

저도 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 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.