J'ai rencontré un problème avec un serveur réseau qui reçoit les signaux des périphériques produits par ma société. L'appareil réutilisera occasionnellement le port source qu'il vient d'utiliser. Cela provoque la suppression du SYN par le serveur. Le périphérique réessaye alors jusqu'à ce que l'ancien socket tombe de TIME_WAIT sur le serveur. Le serveur puis SYN-ACKs.Serveur réseau Java et TIME_WAIT
Le serveur est écrit en Java. Malheureusement, il n'est pas possible de modifier correctement le périphérique pour faire passer les ports correctement, car ils sont nombreux sur le terrain et la mise à jour des unités existantes n'est pas une option. L'ancien logiciel a été écrit en C++ et a effacé le port TIME_WAIT de la liste dans la pile TCP de Windows.
Quelqu'un peut-il me donner des conseils sur la façon de contourner TIME_WAIT de Java sur Windows?
EDIT: J'ai effectivement confirmé dans Wireshark que le périphérique réutilisait un port récemment utilisé.
Sur le socket serveur J'utilise les options suivantes:
socket = new ServerSocket();
socket.setPerformancePreferences(3, 2, 1);
socket.setReuseAddress(true);
socket.setSoTimeout(CLIENT_READ_TIMEOUT);
socket.bind(new InetSocketAddress(group.getPort()), MAX_TCP_BACKLOG);
et la prise en charge client a ce qui suit fixé après réception:
Socket client = server.accept();
client.setKeepAlive(false);
client.setSoLinger(true, 0);
client.setReuseAddress(true);
client.setTcpNoDelay(true);
client.setSoTimeout(CLIENT_READ_TIMEOUT);
J'ai essayé SO_LINGER à la fois vrai et faux, avec exactement les mêmes résultats de trace. CLIENT_READ_TIMEOUT est défini sur 10 secondes.