/ / La grabación lenta de socket en Windows para muchos mensajes pequeños: java, windows, sockets, python-2.7

Recopilación lenta de socket en Windows para muchos mensajes pequeños: java, windows, sockets, python-2.7

Estoy desarrollando un pequeño servidor en Python usando la biblioteca de sockets (SOCK_STREAM). Se supone que el servidor recibe muchos mensajes pequeños (25-40 bytes), los procesa y los reenvía lo más rápido posible.

En Linux y OSX funciona perfectamente, socket "sLa función recv devuelve datos tan pronto como llega. Desafortunadamente, en Windows (8 Pro) parece acumular datos antes de devolverlos desde la función recv.

He tratado de limitar la cantidad máxima de datos que se leen con la función recv, pero eso no ayudó mucho. Parece que los datos se acumulan internamente.

¿Hay alguna opción de Socket específica que tenga que configurar en el servidor (Python) o en el cliente (Socket de Java)?

EDITAR

Uno de mis colegas sugirió redondear cada mensaje a 1 KB rellenándolo con datos ficticios. Esto puede ayudar a evitar los búferes internos apuntados por PeterLawrey.

No tuve la oportunidad de probarlo. ¿Crees que puede ser útil y que es una técnica válida y ampliamente adoptada?

Respuestas

-1 para la respuesta № 1

La forma de manipular la cantidad de memoria del kernel almacenada para un socket en un programa Java es establecer SO_RCVBUF (en un programa C / C ++ que use setsockopt para hacer esto).

Preferiría no reproducir grandes cantidades de código aquí, sino más bien darte algunos consejos para que los veas.

Documentación de SocketOptions
Documentación de SO_RCVBUF

Puedes usarlos para reducir la cantidad de búfer que el kernel almacenará antes de que te devuelva cosas.

Dicho esto, no puedo ver ninguna razón por la que si su aplicación tiene un SOCK_STREAM, no devuelva inmediatamente los datos disponibles. Creo que otra cosa es probable que el problema.