client source 포트로 특정 포트 할당 받지 않기.

colortime의 이미지

환경 : 윈도우 소켓 / c++ / vs 2005

소켓 프로그래밍을 할 때 client는 bind 해주지 않으면 자동으로 os로부터 source port를 할당받게 되잖아요?
그 때 포트 몇개를 제외하고 할당 받는 방법이 있을까요?

bind를 명시적으로 사용해서 지정하는건 해결책이 안될 것 같습니다. 많은 연결이 필요한 프로그램이라서..
그리고 방화벽으로 포트 사용을 막거나, 다른프로그램으로 사용하지 않을 포트를 선점하는 것도 안될 것 같습니다.

상황 :
한 호스트에서 2가지 프로그램이 돌고 있습니다.
프로그램 1 : 간헐적으로 2000번 포트를 열어서(리슨) 외부의 메세지 인입을 받음 (서버 역할)
프로그램 2 : 요청이 있을 때 마다 새로운 connection을 외부 서버에 생성.

프로그램 1은 간헐적으로 2000번 포트를 사용하다 보니 2000번 포트가 사용이 안되는 순간이 있는데,
이때 프로그램 2가 2000번 포트를 소스포트로 사용하는 경우가 생기면서 프로그램1이 포트를 열려고 할 때 충돌되는 현상이 있습니다.

프로그램 1은 제가 작성한 프로그램이 아니라서 수정할수가 없구요, (바이너리만 존재) 프로그램 2는 제가 만들어서 수정할 수 있습니다.
프로그램 2의 socket 통신을 어떻게 구성하면 2000번 포트는 사용안하는 client를 만들 수 있을까요?

yhsuk의 이미지

그냥 보자마자 단순하게 생각한 건데, 포트번호 풀링(?) 비슷하게 자료구조를 만들면 어떨까 합니다.

1. List 자료 구조의 변수로 AvailPorts, BuzyPorts를 만든다.
2. AvailPorts에 사용하려는 범위의 포트를 모두 Insert한다.
3. 클라이언트는 연결이 필요할 때, AvailPorts에서 하나씩 할당 받고, 할당받은 Port를 BuzyPorts에 넣는다(풀링 클래스를 도입하는 것도 좋을듯)
4. 클라이언트는 할당 받은 포트를 bind하여 연결에 사용한다.
5. 클라이언트는 해당 연결이 종료되면, 할당받았던 Port를 BuzyPorts에서 삭제하고, 다시 AvailPorts에 넣어준다.

자료구조는 적합한 것을 잘 선택하면 되고, 쓰레드를 쓰는 프로그램이면 자료구조 조작시 잘 잠궜다 풀어주고...

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

colortime의 이미지

답변 감사합니다.

괜찮은 방법인거 같습니다.
한 포트만 블랙리스트 하는 방법을 찾지 못한다면,
말씀하신대로 가용한 포트번호에서 선택하도록 만들어야겠군요.
bind에 실패처리 까지 하면, 현재 문제는 해결될거 같습니다.
감사합니다 !

yhsuk의 이미지

Ephemeral port에 대해서 모르고 댓글을 달았었네요. 이미 해결하셨겠지만
다음 url들을 참고하시면 될 것 같습니다.

https://en.wikipedia.org/wiki/Ephemeral_port
http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html
http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1807&rssMode=1&wtype=0

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

댓글 달기

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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 사용할 수 있는 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.