Сообщение сокета иногда не отправляется в Windows 7/2008 R2 - PullRequest
4 голосов
/ 08 декабря 2010

При отправке двух сообщений UDP на компьютер в Windows 7 похоже, что иногда первое сообщение вообще не отправляется. Кто-нибудь еще испытывал это?

Тестовый код ниже демонстрирует проблему на моем компьютере. Когда я запускаю тестовую программу и наблюдаю весь UDP-трафик до 10.10.42.22, я вижу, что второе UDP-сообщение отправляется, но первое UDP-сообщение не отправляется. Если я немедленно снова запустил программу, то оба UDP-сообщения будут отправлены.

Не каждый раз происходит сбой, но обычно это происходит, если я подожду пару минут, прежде чем снова запустить тест.

#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;
}

1 Ответ

3 голосов
/ 08 декабря 2010

Проблема здесь в основном та же, что и в этом сообщении , и она связана с разделом 2.3.2.2 RFC 1122:

2.3.2.2 ARP Packet Queue

Канальный уровень ДОЛЖЕН сохранить (а не отбросить) по крайней мере один (последний) пакет из каждого набора пакетов, предназначенных для одного и того же неразрешенного IP-адреса, и передать сохраненный пакет, когда адрес будет разрешен.

Похоже, что открытие нового сокета для каждого UDP-сообщения - это обходной путь.

...