socket 프로그래밍에 대한 질문입니다.

memeyou의 이미지

개발은 하다가 묘한 문제에 부딪혔습니다.
상황을 설명하면..

test1이라는 호스트에 program_1 이라는 소켓 클라이언트가 떠 있는데 이게 test2라는 호스트의 서버에 접속합니다.
당연히 test2의 특정 포트에 접속을 하는데, 클라이언트는 OS에서 정해준 무작위의 포트를 이용하여 test2의 서버의 특정 포트에
접속하는 것으로 압니다.

문제는 promgram_2라는 소켓 서버 프로그램이 test1에 50000번 포트로 기동이 되려고 할때,
이미 test1에 떠있는 promgram_1이 test2에 접속할때 무작위로 정해진 포트가 50000으로 test2의 서버에 붙는다는 것이 문제입니다.

netstat으로 확인을 해보면 program_1이라는 클라이언트가 test2에 접속할때 무작위(?)로 얻어진 50000번 포트를 이용해서 접속을
하는 바람에, 같은 호스트에 50000포트를 이용해서 기동되야할 program_2 서버가 bind를 하지 못하는 경우가 발생하네요.

test1....................................test2
program_1(50000포트) ------------------> test2_server (12345포트)

이런 상태인데
test1에 promgram_2라는 서버가 50000포트를 이용해서 기동하려면 이미 program_1이라는 클라이언트가 test2_server라는 서버에 붙을때 50000포트를
이용한다는 거지요.

program_1을 kill하고 program_2를 실행한 후에, program_1을 실행하면 당연히 50000포트를 이용하지않고 다른 무작위의 포트를 사용하게 되서
문제는 없어집니다만, 항상 이 상황을 체크할 수는 없습니다.

program_1이 실행되서 서버에 접속할때 사용하는 포트자체도 제어할 수는 없는 걸까요..

혹시나 클라이언트들이 사용하는 포트들은 OS차원에서 그 범위가 정해져 있어서, 서버를 구현할때 해당 범위의 포트를 이용하지 않아야하는 건지요..
조언 부탁드립니다.

tinywolf의 이미지

문제를 요약한다면..

program_1이라는 클라이언트 프로그램은 서버에 접속할 때 빈포트를 사용해서 접속.
program_2는 50000번 포트를 사용.
그런데 program_1을 실행시키면 50000번 포트로 실행됨.
그래서 program_2가 실패.

아마도 program_1은 순차적으로 사용하지 않는 포트를 찾는데 50000번부터 시작해서 찾는 것인지..
아니면 공교롭게도 OS가 매번(?) 50000번을 할당하는 것인지..

program_1을 고칠 수 있다면 50000번을 회피하는 것이 가장 좋을듯 한데
질문을 봐서는 program_1을 고칠 수는 없는 것같군요.
그러면 program_2가 다른 포트를 사용하도록 수정... 쿨럭..

OS 차원에서 어플리케이션이 사용할 포트 영역을 정한다는 이야기는 못 들어본 것 같은데..
방법이 있다면 저도 궁금해지는군요.

ㅡ_ㅡ;

klenui의 이미지

문제를 잘 이해한건지 모르겠습니다만, program1의 사용 port를 지정할려면 해당 port로 bind해주면 되는 거 아닌가요..?

pizza1977의 이미지

Client 소켓을 50000이 아닌 포트로 명시적으로 바인딩하는게 정답일 듯 싶네요.

포탈이는 불사신

-------------
포탈이는 불사신

kewlbear의 이미지

저도 어제 비슷한 상황을 겪었습니다만 서버 프로그램이 먼저 실행되도록 하는 방법 밖에 없지 않을까요?

fracktal의 이미지

서버의 포트를 well-known 포트로 지정하면 안되나요?


'아.... 하루종일 놀고 싶다...'

feanor의 이미지

sysctl 값인 net.ipv4.ip_local_port_range가 클라이언트 포트 설정인 것으로 알고 있습니다.

codepage의 이미지

일반적으로 서버 프로그램은 클라이언트 프로그램이 접속에 응답하여야 하기 때문에 항상 돌고 있어야 하는 것이 맞습니다.
님의 경우는 먼저 모든 서버 프로그램을 기동시키시고 그다음 클라이언트를 기동시키는 것이 맞는 답이 아닐까요?
그러면 나머지는 OS가 알아서 해줄것 같습니다.

댓글 달기

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