소켓프로그래밍 사용중인 포트

hyun1023의 이미지

메인에서 자식프로세스를생성하여 자식프로세스마다 p2p 연결을 합니다.(다중 서버)

bind 할때 같은 포트는 못쓰겠지요?

그럼 예를들어 디폴트로 6000번 포트를 쓰고 사용중이면 6001을 쓰고 해서 bind 하려고하는데 bind 할때 해당포트가 사용중인지 아닌지 알아야 할텐데 어떻게 알수 있나요? 그냥 무작정 bind 시켜본후 제대로 에러안나면 쓰고 에러나면 1증가시킨후 다시 bind 시키고 이런방법을 써야하는지 해당포트가 사용중인지 아닌지 알수있는 방법이 있는지 (프로그램내부에서) 답변주시면 감사하겠습니다.

hyun1023의 이미지

hyun1023 wrote:
메인에서 자식프로세스를생성하여 자식프로세스마다 p2p 연결을 합니다.(다중 서버)

bind 할때 같은 포트는 못쓰겠지요?

그럼 예를들어 디폴트로 6000번 포트를 쓰고 사용중이면 6001을 쓰고 해서 bind 하려고하는데 bind 할때 해당포트가 사용중인지 아닌지 알아야 할텐데 어떻게 알수 있나요? 그냥 무작정 bind 시켜본후 제대로 에러안나면 쓰고 에러나면 1증가시킨후 다시 bind 시키고 이런방법을 써야하는지 해당포트가 사용중인지 아닌지 알수있는 방법이 있는지 (프로그램내부에서) 답변주시면 감사하겠습니다.

근데 FTP 서버의 경우는 21,20 고정으로쓰는데 다중 접속 서버이니 좀 궁금하네요..

somecan의 이미지

각 클라이언트와 P2P로 연결한다는 말이 다소 애매 모호하기는 하지만 클라이언트당 서버 프로세스 하나라고 전 알아들었습니다.

첫번째는 클라이언트가 접속을 요청할 때마다 새로운 포트에 바인드를 할 필요는 없습니다. 연결은 양쪽 주소 정보를 한쌍으로 가지고 있는 소켓페어로 구분되기 때문에 fork나 select등으로 클라이언트들을 다루시면 됩니다.

두번째로 FTP같은 프로그램의 포트가 공유되는것처럼(?)보이는 것은 bind를 생각해보시면됩니다. 소켓에 SO_REUSEADDR 옵션이 지정되 있지않다면 기본상태로는 한 포트에 하나의 프로세스만 지정될 수 있습니다. 여러 클라이언트가 서버로 동시에 한포트로 접속할 수 있는 것은 서버가 클라이언트에 연결 요청시마다 bind를 하지 않기 때문입니다. 실제로 클라이언트의 연결 요청을 받아들이는 부분은 bind->listen 후의 accept가 하죠.

클라이언트도 포트를 지정해 줄 수 있지만 대부분 이것은 직접 지정하지 않고 커널이 임의의 포트를 지정하도록하죠.

네트워크 서적의 bind()부분과 concurrent server 부분을 참고하시면 될 것 같습니다.

soMeCan

익명 사용자의 이미지

hyun1023 wrote:

...
근데 FTP 서버의 경우는 21,20 고정으로쓰는데 다중 접속 서버이니 좀 궁금하네요..

addressing에 대한 문제군요.
tcp/ip는 5개의 필드에 의해 구분됩니다.
즉, 통신(유니캐스트인.)의 종류 구분방법이 5개의 파라메터에 의한다는 얘기입니다.

{protocol, source ip, source port, destination ip, destination port}

예를들어, 다음을 가정하겠습니다.
** 가정
1) ftp 서버 : 192.168.0.1
2) ftp : 21
3) ftp-data : 20
**
이 경우, 5개 튜플을 ftp server입장에서 기술하면,
{tcp, 192.168.0.1, 21, *, * }
{tcp, 192.168.0.1, 20, *, * }
이렇게 2개의 소켓을 생성하고 대기하겠군요.
원격지 주소, 원격지 포트가 틀리다면 이는 전혀 다른 연결로 인지됩니다.
'*' 표는 임의의 값을 의미합니다.

심지어 원격지의 동일 ip에서 다수개의 연결도 '원격지port'만 틀리다면, 이는 틀린 연결인 것입니다.

5 associations라고 하지요.

jongi의 이미지

Anonymous wrote:

심지어 원격지의 동일 ip에서 다수개의 연결도 '원격지port'만 틀리다면, 이는 틀린 연결인 것입니다.

심지어 원격지의 동일 ip에서 다수개의 연결도 '원격지port'만 다르다면, 이는 다른 연결인 것입니다.

이 말씀 하신거죠? ^^
왜 틀리다고 하신건지 혼자 갸우뚱하다가....

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

댓글 달기

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