[완료] 각기 다른 사설망(NAT)에 들어있는 클라이언트를 서로 연결해주기 (메신저)
글쓴이: templars / 작성시간: 월, 2011/04/18 - 11:59오전
…는 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로 해야 하는 것일까요? 달리 물을 곳이 없어서 이곳에 여쭤봅니다..
Forums:
음..
서로 다른 소켓을 열어서 같은 포트에 바인딩하고 하나는 listen하고 하나는 connect를 하게 하면 될듯하군요
REUSE_ADDRESS 였던가.. 하여간 소켓 옵션을 통해서 멀티바인딩은 허용이 될꺼구요.
단, MSDN의 정확한 정보를 확인해보시기 바랍니다.
오래되서 가물가물하네요..
감사합니다
그렇군요 소켓을 두 개 써서 같은 포트에 바인드.. 바로 해보겠습니다ㅎㅎ
정말 감사합니다
일단 localhost상에서는 정상적으로 작동하네요. 소켓 옵션 SO_REUSEADDR을 이용하여 하나의 포트에 두 소켓을 바인드 한 다음, connect()를 shutdown()으로 Graceful하게 종료 후, 다른 소켓을 사용하여 listen() accept()를 수행하는데 성공했습니다. 정말 감사합니다.
성공하셨다고 해서 질문 드립니다.
SO_REUSEADDR이 JAVA에서 setReuseAddress 옵션이랑 같은거 아닌가요??
왜 저는 setReuseAddress 옵션을 true로 줘도 "Address already in use: JVM_Bind" 에러 메세지가 나올까요?
댓글 달기