puede - El mensaje de socket a veces no se envía en Windows 7/2008 R2
no se puede inicializar la interfaz windows sockets (1)
Al enviar dos mensajes UDP a una computadora en Windows 7, parece que a veces el primer mensaje no se envía. Alguien más ha experimentado esto?
El siguiente código de prueba demuestra el problema en mi máquina. Cuando ejecuto el programa de prueba y miro todo el tráfico UDP a 10.10.42.22, veo que se envía el segundo mensaje UDP, pero no se envía el primer mensaje UDP. Si inmediatamente ejecuto el programa nuevamente, se envían ambos mensajes UDP.
No falla todo el tiempo, pero generalmente sucede si espero un par de minutos antes de volver a ejecutar la prueba.
#include <iostream>
#include <winsock2.h>
int main()
{
WSADATA wsaData;
WSAStartup( MAKEWORD(2,2), &wsaData );
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons( 52383 );
addr.sin_addr.s_addr = inet_addr( "10.10.42.22" );
SOCKET s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( sendto( s, "TEST1", 5, 0, (SOCKADDR *) &addr, sizeof( addr ) ) != 5 )
std::cout << "first message not sent" << std::endl;
if ( sendto( s, "TEST2", 5, 0, (SOCKADDR *) &addr, sizeof( addr ) ) != 5 )
std::cout << "second message not sent" << std::endl;
closesocket( s );
WSACleanup();
return 0;
}
El problema aquí es básicamente el mismo que este post y tiene que ver con la sección 2.3.2.2 de RFC 1122:
2.3.2.2 Cola de paquetes ARP
La capa de enlace DEBERÍA guardar (en lugar de descartar) al menos un (el último) paquete de cada conjunto de paquetes destinados a la misma dirección IP no resuelta, y transmitir el paquete guardado cuando la dirección se haya resuelto.
Parece que abrir un nuevo socket para cada mensaje UDP es una solución alternativa.