Получая это странное поведение, не знаю, если SO_LINGER (0) - это «лучший способ» решить эту проблему.
Это происходит только тогда, когда у меня есть эти 2 фактора вместе:
- ОС - windows
- меньшая пропускная способность интернета
Когда эти два фактора объединяются, мои tcp-соединения (на стороне клиента), сразу после вызова close (), получаютзастрял в FIN_WAIT , а затем TIME_WAIT на долгое и долгое время
(В этой сети одно и то же приложение, работающее в других ОС, работает как положено. То же самое относится и кв Windows, но в лучшем сетевом соединении)
В этом конкретном случае я просто беспокоюсь о состояниях fin_wait _ (1 или 2).Моя первая мысль - установить для so_linger значение 0, но я не совсем убежден, что неудачное закрытие является правильным (или единственным) вариантом здесь.
Есть идеи о том, как мне справиться с этим?Есть ли другой способ заставить окна закрывать эти соединения (программно)?
(EDIT)
EventLoopGroup group = new NioEventLoopGroup(); try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
// .option(ChannelOption.SO_LINGER, 0) ( ?? )
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new MyHandler());
p.addLast(new WriteTimeoutHandler(8, TimeUnit.SECONDS));
ch.config()
.setSendBufferSize(TCP_BUF_SIZE)
.setReceiveBufferSize(TCP_BUF_SIZE);
}
});
ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
channelFuture.channel().closeFuture().sync();
} finally {
group.shutdownGracefully(); }