UDP 클라이언트의 포트 정보

peccavi의 이미지

안녕하세요. 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. 이 두 포트가 정확이 무슨 포트들인가요?

장황한 설명 읽어주셔서 감사드리구요,
작은 답변이라도 꼭좀 부탁드리겠습니다. ㅜ_ㅡ

즐거운 추석 되세요~~

mix1009의 이미지

*:30000 번이라고 뜨는건 30000번 포트에 bind 했다는 뜻인데,
sendto 할때 bind한 소켓을 이용해서 보내시는지요? 다른 소켓을
통해서 보낸다면 포트가 바뀌겠죠.

peccavi의 이미지

예를 드느라 30000번이라고 썼지만 C1에서 bind는 하지 않았습니다. 32113정도의 임의로 배정받은 포트였습니다.

----
jai guru deva om...

----
jai guru deva om...

mix1009의 이미지

클라이언트가 모두 NAT 밖에 있는지요?

peccavi의 이미지

아 아닙니다.. 세 프로그램 모두 동일한 머신에서 로컬호스트로 실행했습니다.

----
jai guru deva om...

----
jai guru deva om...

mix1009의 이미지

포트 번호 읽을때, byte order 처리를 안해주신거 같네요. ntohs(port)

peccavi의 이미지

나이가 들수록 점점 바보가 되가는 느낌입니다. ㅋㅋ
바이트오더 문제 맞았습니다. 답변 정말 감사드려요.. ^^/

----
jai guru deva om...
http://peccavi.net

----
jai guru deva om...

GENIUS의 이미지

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

recvfrom() 펑션은 클라이언트 프로그램이 데이터를 전송할때 서버의 수신 포트와 클라이언트 자신의 수신하고자하는 로컬포트를 정의하여 데이터를 전송합니다.

서버는 udp데이터를 받게 되면 클라이언트의 ip와 클라이언트의 바인드 포트를 추출하여 sendto()펑션을 이용하여 전송하게 됩니다.

수신된 udp 패킷에서 클라이언트의 수신 포트를 알수 있습니다.
그리고 반드시 클라이언트를 속켓 생성시 로컬포트를 바이드(bind)하여 주어야 합니다.
바인드를 않으면 클아이언트는 전송만하고 수신은 하지 않습니다.

로컬포트를 임의로 설정하지 않는 경우는 클라이언트 컴퓨터의 사용하고 있지 않은 포트가 자동으로 설정되는 것으로 생각됩니다.

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.