2010-05-13 4 views
0

Java SIP 클라이언트 내의 소켓에 몇 가지 문제가 있습니다. 주소와 포트에 바인딩 할 때 문제가 발생하면 다시 연결을 시도해야합니다. 일반적으로 프로세스를 중지했다가 다시 시작한 후입니다. 문제는 포트가 바인딩되어 있고 로컬 포트를 증가시켜야한다는 것입니다.Java : 소켓 바인딩을 지우는 방법

바인딩하기 전에 대상 포트에서 바인딩을 제거하려면 어떻게합니까?

그럴 수 없다면 소켓 바인딩을 찾아 수동으로 닫을 수 있도록 프로세스가 끝나기 전에 어떻게 처리 할 수 ​​있습니까?

@ Jason - Jason,하지만이 경우에는 클라이언트를 작성 중이며 서버에 대한 액세스 권한이 없습니다. 참조하고있는 포트가 클라이언트에 있으며 로컬입니다. 연결을 시도하기 전에 포트 바인딩을 플러시 할 수 있습니까? 프로세스 인터럽트를 잡아낼 수있는 방법이 없다면, perl처럼 'die'신호를 잡아서 어떤 포스트 프로세싱을하는 방법이있다. 자바는 이것을 가지고 있는가? 그렇다면 소켓 연결에서 close()를 호출 할 수 있습니다.

답변

3

10 번 중 9 번 경험에서이 문제 클래스에 대한 대답은 "SO_LINGER 찾기"입니다.

클라이언트에서 플러그를 잡아 당기면 서버는 이미 소켓에서 보낸 데이터를 수집하기를 원합니다. 따라서 버퍼가 지워질 때까지 해당 데이터와 포트를 유지합니다.

보통 서버에서 방금 발견 한 DOS 공격 (의도적 또는 우발적)으로 인해 이러한 버퍼를 극단적 인 편견으로 죽이고 싶습니다.

+0

매우 흥미 롭습니다. 두 자바 서버처럼 _same_ 포트에 바인딩하는 것 자바 소켓과 함께 몇 가지 물건을 봤어요! 원더 경우 관련. – Justin

+0

Jason,하지만이 경우에는 클라이언트를 작성 중이며 서버에 액세스 할 수 없습니다. 참조하고있는 포트는 클라이언트에 있으며 로컬입니다. 연결을 시도하기 전에 포트 바인딩을 플러시 할 수 있습니까? 프로세스 인터럽트를 잡아낼 수있는 방법이 없다면, perl처럼 'die'신호를 잡아서 어떤 포스트 프로세싱을하는 방법이있다. 자바는 이것을 가지고 있는가? 그렇다면 소켓 연결에서 close()를 호출 할 수 있습니다. –

+0

그래도 작동합니다. 일반적으로 연결을 만들 때 원래 포트는 별 문제가되지 않습니다 (방화벽에서 구멍 펀칭으로 작업하고 있습니까?)하지만 일단 소켓이 생성되면 TCP-IP 스택은 상관 없습니다 누가 요청을 시작 했습니까? 당신이하지 않는다고 말하지 않는 한 당신의 커널은 당신이 끝냈다 고 생각하는 연결을위한 패킷을 여전히 잡을 것이다. – Jason

0

SO_LINGER를 사용하지 마십시오. 단지 불안정합니다. 진짜 질문은 당신이 왜 로컬 포트에 바인딩하는 것입니까?

+0

들어오는 패킷을 수신 대기 하시겠습니까?실제로 바인딩을하지 않는 임 - JAIN-SIP :: SipProvider - ListeningPoint. 프로그램 종료를 트랩 할 수 있다면 리스닝 포인트에서 소멸자 메소드를 호출 할 수 있지만 아무도 내가 어떻게 할 수 있는지 알지 못합니다. 펄에서는 어떤 것도 함정에 빠질 수있다. –

+0

그러나 나가는 소켓을 로컬 포트에 묶을 필요는 없다. 시스템에서 매번 새로운 것을 선택하고 매번 새로운 것을 선택합니다. 작년에 JAIN-SIP에서 어떤 작업을했는데이 문제를 전혀 알지 못했습니다. 로컬 포트를 단일 값으로 설정하는 일부 구성 항목을 설정하고 있습니까? – EJP

+0

EJP - ListeningPoint는 대상 클라이언트 또는 서버로부터 들어오는 응답을 수신 할 목적으로 SipProvider 스택을 로컬 IP 및 로컬 포트에 바인딩합니다. 프로그램이 멈추었을 때 포트는 여전히 바운드되어 있고 프로그램을 다시 시작할 때 로컬 리스닝 포트를 증가시켜야합니다 - 만약 내가 사용하지 않으면 '포트가 이미 사용 중입니다'오류가 발생합니다 –