[질문] 네트워크프로그래밍에서 bind() 에 관한 질문입니다.

dol의 이미지

안녕하세요!~
땐땐한 초보입니다.

소켓프로그램을 하다보니... 궁금한게 있어서 올립니다.

tcp로 aaa라는 데몬은 만들어 실행시키고
또 다시 aaa를 실행시켜면 bind() 할대
errno=98 (address already in use) 가 리턴되면서 실행종료가 됩니다.
당연히 같은 tcp port를 또 다른 프로그램이 열지 못하게 하는 것이겠지요...

근데 udp로 bbb라는 데몬을 만들어 실행하고
또 bbb를 실행시키더라도 bind()에서는 errno=98이 리턴이 않되고
그냥 실행이 되버리더라구여,,,,,

해서 netstat -na 로 보면
해당 udp 포트가 데몬이 실행된 갯수만큼 열려져있더라구여,,,,

이런 경우 문제가 있는 것인지....
제 생각으론 bbb라는 데몬이 현재 실행중인 상태에서
bbb라는 데몬소스를 수정해서 재컴팔후 또 실행시켜면
같은 bbb라는 데몬이 2개 실행되며 udp 포트 또한 두개가 되잖아여,,,

이렇게 되면 상당히 곤란할 경우가 될것 같은데요,,,,

혹시 제가 udp 소켓을 bind 할때 먼가 잘못 작성했나 싶기도 하구요
아니면 원래 udp가 같은 port를 여러개 열어도 상관이 없는지...
상당히 애메합니다.

혹시 잘 아시는 분이 계시면 답변을 달아 주시면 대단히 감사하겠습니다.
그럼,,,,,, 즐거운 주말되시길......

aero의 이미지

4.5. SO_REUSEADDR 가 정확히 뭐하는 것인가?

이 소켓 옵션은 커널에게 비록 이 포트가 busy상태일 지라도 그것을 계속해서 사용하도록 하
게 한다. 이것은 서버가 셧다운 되고 소켓이 그것의 포트에서 아직 active상태인 동안에 바로 재
구동 되었을 경우에 유용하다. 하지만 만약 소켓이 active된 상태에서 어떤 예기치 않은 데이터가
들어오면 이것이 서버를 혼란스럽게 할 수 있다라는 점을 알아 둬야 한다.

"소켓은 5개의 튜플(proto, local addr, local port, remote addr, remote port)이고,
SO_REUSEADDR는 단지 로컬 주소를 다시 사용할 수 있으며. 이 5튜플은 계속해서 유일해야 한
다"라는 것을 Michael Hunter (mphunter@qnx.com)이 지적했다.

이것은 사실이고, 이것은 매우 예기치 않은 데이터가 서버에 거의 들어오지 않을 것이란 것의
이유가 된다. 위험한 것은 이 5 튜플이 네트웍에 여전히 떠다니고, 여기저기 튀어 다니는 동안 새
로운 연결이 같은 기계의 클라이언트로 부터 들어오게 되면 똑같은 리모트의 포트를 얻게된다.
이것은 2.7의 "TIME_WAIT 상태에 대해 설명해 달라" 부분에 설명되어 있다.

4.11. SO_REUSEADDR 와 SO_REUSEPORT의 차이는 무엇인가?

SO_REUSEADDR는 여러분의 서버로 하여금 TIME_WAIT상태에 있는 주소를 바인드 하게 해
준다. 이것은 같은 주소로 하나 이상의 서버가 바인드 하는 것를 허용하지 않는다. 이것은 보안의
위험성 있다고들 말한다. 왜냐하면 다른 서버도 INADDR_ANY에 반대되는 것 처럼 주소를 지정
하여 같은 포트로 바인드 할 수 있기 때문이다. SO_REUSEPORT는 하나의 포트로 여러 프로세
스가 바인드 하는 것을 허용한다.

Richard Stevens (rstevens@noao.edu):

이것은4.4BSD의 멀티캐스팅 코드에서 새로 생긴 flag이다. (비록 이 코드가 다른 어떤 곳으로
부터 생긴 것일지라도, 그래서 이 새로운 SO_REUSEPORT flag를 누가 개발했는지는 몰라도)

이 flag는 여러분들이 이미 사용중인 하나의 포트를 재바인드 할 수 있도록 해준다. 그러나 모
든 이 포트의 사용자들이 그 flag를 지정할 경우에만이다. 이것은 멀티캐스팅 어플리케이션을 위
한 의도라고 생각된다. 왜냐하면 만약 여러분이 같은 어플리케이션을 하나의 호스트에서 실행할
때 모든 어플리케이션은 같은 포트를 바인드할 필요가 있기 때문이다. 그러나 이 flag는 다른 용
도도 가지고 있다. 예를 들어 다음의 이 사람이 올린 글을 보면...

Stu Friedberg (stuartf@sequent.com):

SO_REUSEPORT는 ftpd의 데이터 연결 설정에서 try-10-times-to-bind 해킹을 제거하기
위해 유용하다. SO_REUSEPORT가 없으면 오직 하나의 ftpd thread만이 준비하고 있는 클라이언
트쪽의 TCP(lhost, lport, INADDR_ANY, 0)와 연결 할 수 있다. 이런 많은 로드가 발생하는 상황
에서는 try-10-times해킹에서보다 더 많은 충돌 thread들이 발생한다. SO_REUSEPORT로 모든
것이 잘 돌아가고, 해킹은 무의미 하게 된다.

나는 또한 DEC OSF가 이 flag를 지원한다는 말을 들었다. 또한 4.4BSD하에서 만약 여러분이
멀티캐스트 주소를 바인딩 하는지, 그리고 SO_REUSEADDR이 SO_REUSEPORT와 같다고 생각
되는지를 주의하라.(p. 731 of "TCP/IP Illustrated, Volume 2"). 나는 솔라리스하에서 여러분들은
단지 SO_REUSEPORT를 SO_REUSEADDR로 바꾸어 놓을 수 있다고 생각한다.

Stevens이 보낸 글중 약간 고친것:

기본적으로 SO_REUSEPORT는 멀티캐스팅이 BSD에 추가되면서 생긴 것이다. 비록 그것이
Steve Deering코드에서 사용되지 않을 지라도. BSD 파생시스템에는 OSF 도 해당된다. 그래서
SO_REUSEPORT는 여러분들이 같은 주소와 포트를 바인드 할 수 있도록 해준다. 그러나 모든
바인더가 그것을 지정 했을 경우에만 그렇다는 얘기다. 그러나 멀티캐스팅 주소를 바인드 할 때,
SO_REUSEADDR은 완전히 SO_REUSEPORT 와 같다.(P 731, "TCP/IP Illustrated, Volume 2".
그래서 멀티캐스팅 어플리케이션의 호환성을 위해 나는 항상 SO_REUSEADDR를 사용한다.

dol의 이미지

오~~~
제가 그 부분을 확인 못했네요!~
많은 도움이 되었습니다.....
감사합니다.
즐거운 주말되세여....

*****************************
삽질맨 허접 돌이었습니다.! ㅠ.ㅠ
*****************************

댓글 달기

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