2012-05-25 3 views
0

자바에서 특정 포트의 TCP 소켓을 바인드하는 프로젝트가 있습니다.TCP 소켓 닫기 및 리 바인드

close() 메서드를 호출했지만 포트 X에서 소켓 바인딩에 대한 close() 메서드를 호출하면 포트 X에서 새 소켓을 몇 초 동안 바인딩 할 수 없습니다. 하지만 몇 초 후에 바인딩하는 것이 좋습니다.

정상적인 현상입니까? 아니면 코드를 다시 검사해야합니까?

+0

아마도 코드의 핵심 라인이 우리에게 조금 도움이 될 것입니다. – rmarimon

+0

관련 항목 : http://stackoverflow.com/questions/9340809/how-long-does-it-take-for-the-os-to-close-the-socket-after-calling-close-metho –

답변

3

나는 특정 포트에 바로 문제의

에서 TCP 소켓을 결합하고, 해결책은 그것을 할 수 없습니다. 시스템을 선택하게하십시오.

특정 로컬 포트에 바인딩하는 것은 모든 것에 대한 해결책이 아닙니다. 적어도 제정신이 아닙니다. 때때로 과도한 넷 관리자는 (a) 보안에 추가되고 (b) 쉽게 구현 될 수 있다는 오해 된 믿음이나 망상에서 아웃 바운드 포트 범위를 지정합니다. 어느 쪽도 정확하지 않습니다.

TIME_WAIT 상태는 '알리는 동안 OS [취하는 동안]'이 아니며 TCP의 필수 보안 기능입니다. 닫힌 소켓은 몇 분 동안 남아 있습니다. 특정 로컬 아웃 바운드 포트에 바인딩하지 않는 한 이것은 기능이 아니라 버그입니다.

+0

프로젝트의 목적 상, 우리 팀은 클라이언트와 서버를 배치 할 수있는 포트가 10 개 밖에 없습니다. 시스템 자체가 자체 프로세스를 위해이 포트들을 묶을 수 있기 때문에 그것이 맞지 않을 수도 있다는 것을 이해합니다. 그러나 특정 포트 뱅크보다 다른 선택의 여지가 없습니다. – NickPro

+0

@ kit-kat 당신의 시스템은 누군가가 위와 같이 어리석은 규칙을 세우지 않는 한 많은 아웃 바운드 클라이언트 포트를 가지고 있습니다. 유일한 제한은 * listening * 포트, 즉 ServerSocket 포트에 있어야합니다. 로컬 아웃 바운드 포트를 지정하지 않아도됩니다. 누군가 동의하지 않는 경우 여기에 의견을 보내십시오. – EJP

+0

http://www.quickmeme.com/meme/3pfxjd/. 당신의 의견에 완전히 찬성합니다. 필자는 동료와 함께이 문제에 대해 논의했으며 OS가 포트 폐쇄를 알리기 위해 잠시 시간을내어 바인딩에 사용할 수 있다고 언급했습니다. OS를 수동으로 알릴 방법이 없다고 생각합니다. 아니면 거기에 있습니까? – NickPro