2013-04-18 2 views
2

교수님으로부터 UDP 소켓을 사용하여 전송 된 데이터 그램 패킷이 하위 레이어에서 단편화되고 이 수신자에게 여러 패킷으로 도착할 수 있음을 알게되었습니다. 종료. 예를 들어 데이터 그램 패킷에 1000 바이트 데이터를 보내면 수신 측에서 일 수 있습니다.은 2 바이트, 500 바이트, 12 바이트 등으로 도착합니다. 따라서 그는 여러 수신 (...)하여 보낸 사람이 보낸 전체 1000 바이트 패킷을 받도록 제안했습니다.Datagramsocket : 수신 (...)이 패킷의 단편화를 처리하는 방법

나중에 데이터 그램 소켓 수신을위한 Java 설명서 (...)를 읽었을 때 다음과 같은 행이 있습니다. "이 방법은 데이터 그램을 수신 할 때까지 차단됩니다." 데이터 그램 패킷이 수신되고 Java를 사용할 때 다중 수신을 수행 할 필요가 없습니다 (이론적으로는 그렇다고하더라도)?

Pls. 밝히다. 이 문제를 해결하기 위해 각 패킷에 대해 여러 개의 수신 (...) 옵션 만있는 경우 pls. 이것을하는 방법에 대한 제안을하십시오.

답변

3

을 호출하면 전체 패킷을 얻을 수 있습니다. 단편 처리는 소켓 아래의 두 레이어에서 발생합니다. 단편화 및 조각 모음은 네트워크/인터넷 계층 (IP)에서 발생하므로 소켓은 단편을 전혀 볼 수 없지만 전체 및 전체 UDP/TCP 패킷 만 수신합니다 (전체 패킷 만 수신 대기 포트로 전송됩니다).

단일 패킷을 얻으려면 복수의 이 필요하지 않지만 UDP가 안정적이지 않으므로 하나의 조각이 네트워크 계층에서 손실되는 경우 (일부 경우에는 패킷이 도착하지 않는 경우) 주문), 당신은 패킷을 얻을 수 없을 것입니다.

패킷 수신에 문제가있는 경우 getReceiveBufferSize()setReceiveBufferSize() 메서드를 확인할 수도 있습니다. 버퍼 크기가 패킷 크기보다 작 으면 패킷을받을 수 있다고 보장 할 수 없습니다.

+0

고맙습니다. @Pescis. – arun

+0

또한 바이트 배열 대신 UDP 소켓에서 메시지 대기열 개념을 사용하면 조각화 된 패킷의 순서가 보존된다는 것을 알게되었습니다. 그러나 UDP 소켓이나 패킷을 만들 때 이것을 어떻게 말할 지에 대한 단서는 없었습니다. 아이디어가 있습니까? – arun

+0

@arun 내 편집을 참조하십시오. 나는 당신이 원하는 것을 표준 자바 라이브러리에서 사용할 수 없다는 것을 확신한다. 당신은 그 기능을 구현할 수 있도록 O.S./driver 레벨로 가야 할 것입니다. – ddmps

관련 문제