socket programming example code c++ visual-c++ sockets

c++ - programming - winsock example



10038 error de socket (4)

Puede haber dos razones para esto:

  1. Su descriptor de socket no está inicializado (es decir, no hace referencia a un socket válido).
  2. closesocket este socket (mediante una llamada a closesocket ) y aun así intentas usarlo.

Tal error siempre es un error , no está relacionado con la actividad / estado real de la red, etc. Esto es equivalente (en cierto sentido) a tratar de usar un recurso / memoria después de liberarlo, o simplemente hacer referencia a un puntero no inicializado.

De modo que para resolver el 10038 debe corregir su código.

PD: si tiene una aplicación de subprocesos múltiples, es probable que cierre el socket en un subproceso, mientras que el otro subproceso siga intentando usarlo.

De todos modos, hay una buena práctica para inicializar los descriptores de socket a INVALID_SOCKET al principio. También INVALID_SOCKET en INVALID_SOCKET inmediatamente después de cerrarlo.

Luego, antes de intentar usarlo, puede verificar si el socket es válido. De esa manera, puede encontrar el escenario problemático.

¿Hay alguna solución para el error del servidor 10038? He hecho la codificación en c ++; el servidor funciona bien de 10 a 12 horas, pero sucede que da 10038 error de socket


Sin ver su código: el síntoma que describe suena como si estuviera filtrando memoria / recursos, es decir, se está olvidando de liberar / eliminar los objetos que está asignando. También podría ser un problema de tiempo. Te sugiero que publiques tu código (reducido).

10038 (WSAENOTSOCK): operación del zócalo en nonsocket. Se intentó una operación en algo que no es un socket. O bien, el parámetro del identificador de socket no hacía referencia a un socket válido, o para seleccionar, un miembro de un fd_set no era válido.


Apuesto a que estás accediendo a un socket que ya cerraste. Este es un error de temporización muy común en la programación de WinSock: las buenas noticias (y las malas noticias, porque es difícil de reproducir) es que no lo estás ejecutando con mucha frecuencia, así que es probable que tu código no necesite mucho trabajo para hacerlo perfecto. Creo que debería agregar diagnósticos seguros para subprocesos que generen una cadena que incluya el valor del socket (un int , básicamente) en cada abrir y cerrar, y desde cualquier lugar donde vea este 10038 u otros errores inesperados.

Si puede agregar esos diagnósticos y luego configurar una prueba de estrés que se centre en abrir y cerrar áreas en su programa (es posible que necesite desforrar el código a un subconjunto pequeño para la prueba unitaria del manejo de los enchufes, tal vez haciendo esto de regreso a -de vuelta en localhost, o en dos máquinas conectadas a LAN), entonces es probable que se manifieste mucho más rápido que 10-12 horas y puede encontrar y arreglar otras ventanas de tiempo en el camino. El objetivo es intentar comprimir 10-12 horas de actividad de socket ''normal'' en el menor espacio de tiempo posible, para realmente exponer cualquier problema de concurrencia difícil de detectar.


También tenga en cuenta el hecho de que, al menos en Windows, obtendrá 10038 si intenta enviar un socket en un hilo que se abrió en un hilo diferente.