2015-01-22 16 views
2

netty 4.0.24receiveBufferSize가 적용되지 않습니다. UDP 패킷 잘림

XML을 통해 UDP를 전달합니다. UPD 패킷을 수신 할 때, 패킷은 항상 길이가 2048이고 메시지를 절단합니다. 그래도 수신 버퍼 크기를 더 큰 것으로 설정하려고 시도했지만 (4096, 8192, 65536) 영광을 얻지는 못합니다.

다른 UDP 인제 스트 메커니즘을 사용하여 UDP 보낸 사람을 확인했습니다. java.net.DatagramSocket을 사용하는 독립형 Java 응용 프로그램입니다. XML은 약 45k입니다.

스택을 DatagramSocketImpl.createChannel (281 행)까지 추적 할 수있었습니다. DatagramChannelConfig를 밟으면, 내가 설정 한 (훌륭한) receiveBufferSize가 있지만, 2048의 rcvBufAllocator가 있습니다.

rcvBufAllocator가 receiveBufferSize (SO_RCVBUF)를 대체합니까? 메시지가 여러 버퍼에 들어 있습니까?

의견이나 다른 해결책을 제공해 주시면 대단히 감사하겠습니다.

또한 언급해야 할 점은 net.x를 많이 사용하는 vert.x라는 ESB를 사용하고 있다는 것입니다. 나는 네티에 이르기까지 추적 할 수 있었기 때문에 여기서 도움을 얻을 수 있었으면 좋겠다.

답변

3

소켓에서 복사 된 수신 데이터 그램의 최대 크기는 실제로 소켓 옵션이 아니라 데이터 그램을 읽을 때마다 클라이언트가 전달하는 소켓 read() 함수의 매개 변수입니다. 이 인터페이스의 한 가지 장점은 알 수 없거나 다양한 길이의 데이터 그램을 받아들이는 프로그램이 들어오는 데이터 그램 복사에 할당 된 메모리의 크기를 적응 적으로 변경하여 전체 데이터 그램을 계속 가져 오는 동안 메모리를 과도하게 할당하지 않는다는 것입니다. (이 할당/예측은 io.netty.channel.RecvByteBufAllocator의 구현 자에 의해 수행됩니다.)

반대로 SO_RCVBUF은 클라이언트가 아직 읽지 않은 모든 데이터 그램을 보유하는 버퍼의 크기입니다.

import io.netty.bootstrap.Bootstrap; 
import io.netty.channel.ChannelOption; 
import io.netty.channel.FixedRecvByteBufAllocator; 
import io.netty.channel.nio.NioEventLoopGroup; 
import io.netty.channel.socket.nio.NioDatagramChannel; 

int maxDatagramSize = 4092; 
String bindAddr = "0.0.0.0"; 
int port = 1234; 

SimpleChannelInboundHandler<DatagramPacket> handler = . . .; 
InetSocketAddress address = new InetSocketAddress(bindAddr, port); 
NioEventLoopGroup group = new NioEventLoopGroup(); 
Bootstrap b = new Bootstrap() 
     .group(group) 
     .channel(NioDatagramChannel.class) 
     .handler(handler); 
b.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(maxDatagramSize)); 
b.bind(address).sync().channel().closeFuture().await(); 

또한 ChannelConfig.setRecvByteBufAllocator

+1

마찬가지로으로 할당을 구성 할 수 있습니다 : 여기

Bootstrap 사용 그물코 4.x의 고정 된 최대 수신 데이터 그램 크기의 UDP 서비스를 구성하는 방법의 예 보충제. UDP의 경우, 'FixedRecvByteBufAllocator'가 기본값으로 사용되며 기본 버퍼 크기는 2048입니다. – louxiu