[완료] 각기 다른 사설망(NAT)에 들어있는 클라이언트를 서로 연결해주기 (메신저)

templars의 이미지

…는 UDP 홀펀칭 말고 다른 방법이 없을까요?

TCP로는 구현이 불가능한 것인지 여쭤보고 싶습니다. (_ _)


저는 이런 시나리오를 생각했습니다.
1) 먼저 클라이언트 A가 TCP 방식을 통해 socket() bind() connect()로 명시적으로 포트를 선택하여 서버와 접속을 합니다.
2) 이를 통해 서버는 클라이언트 A의 실제 IP와 포트 번호를 알게 됩니다. 이를 클라이언트 B에게 전달합니다.
3) 클라이언트 A는 shutdown()을 통해 서버와의 연결을 우아하게 종료합니다. (하지만, 소켓을 폐기하는것은 아닙니다.)
4) 클라이언트 A는 연결을 종료했으므로 1)에서 만들어둔 소켓을 사용해 listen()을 시작합니다.
5) 클라이언트 B는 서버로 얻은 정보를 통해 클라이언트A에게 connect()합니다.
6) TCP 연결이 완성됩니다.


..가 안 되더군요; 정확히는 4)가 안 됩니다. 3)에서 shutdown()은 성공했다고 나오던데 listen()을 하면
이미 연결이 되어 있다는 wsagetlasterror() 에러 메시지가 뜹니다.

그냥 비연결적인 UDP로 해야 하는 것일까요? 달리 물을 곳이 없어서 이곳에 여쭤봅니다..

익명 사용자의 이미지

서로 다른 소켓을 열어서 같은 포트에 바인딩하고 하나는 listen하고 하나는 connect를 하게 하면 될듯하군요

REUSE_ADDRESS 였던가.. 하여간 소켓 옵션을 통해서 멀티바인딩은 허용이 될꺼구요.

단, MSDN의 정확한 정보를 확인해보시기 바랍니다.

오래되서 가물가물하네요..

templars의 이미지

그렇군요 소켓을 두 개 써서 같은 포트에 바인드.. 바로 해보겠습니다ㅎㅎ

templars의 이미지

일단 localhost상에서는 정상적으로 작동하네요. 소켓 옵션 SO_REUSEADDR을 이용하여 하나의 포트에 두 소켓을 바인드 한 다음, connect()를 shutdown()으로 Graceful하게 종료 후, 다른 소켓을 사용하여 listen() accept()를 수행하는데 성공했습니다. 정말 감사합니다.

익명 사용자의 이미지

SO_REUSEADDR이 JAVA에서 setReuseAddress 옵션이랑 같은거 아닌가요??
왜 저는 setReuseAddress 옵션을 true로 줘도 "Address already in use: JVM_Bind" 에러 메세지가 나올까요?

댓글 달기

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