У меня есть код UDP-клиента C++ на основе сокетов WSA - это хорошо работает. Код был первоначально написан на VS6, и я недавно перекомпилировал его в VS2010 для 64-битной среды с небольшими корректировками.C++ UDP sendto сбой, нужен сон
Теперь sendto() не отправляет что-либо, если нет сна (..) или любой эквивалентной задержки после sendto() и перед closesocket(). «Сбой» означает, что sendto() возвращает нужный объем данных, но я не вижу сообщений в сети (я использовал wirehark для проверки этого).
Это мой код:
void CTest::SendHello()
{
SOCKET sSocket;
sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(m_strDstIpAddr);
addr.sin_port = htons(m_nTxPort);
int nMsgLen = 8;
char pTxBuffer[8];
*((DWORD*) &pTxBuffer[ 0]) = 0x11223344;
*((DWORD*) &pTxBuffer[ 4]) = 0;
int nSent = sendto(sSocket, pTxBuffer, nMsgLen, 0, (struct sockaddr *) &addr, sizeof(addr));
Sleep(10); // <- this seems to be necessary
if (nSent != nMsgLen)
{
CString s = "error sending HELO\n";
AfxMessageBox(s);
}
closesocket(sSocket);
}
Без сна(), код не посылает ничего, пока он не вернется без ошибок. С Sleep() он работает. Кроме того, это происходит в версии выпуска, при компиляции для отладки, код также работает без Sleep().
Кажется, как будто closesocket() закрывает сокет до отправки сообщения, но я думал, что sendto() является синхронной функцией. Я попытался использовать SO_LINGER, но это не относится к сокетам SOCK_DGRAM.
Поскольку код находится внутри DLL, я не могу создать сокет в ctor и удалить его в dtor, потому что SendHello() может быть вызван из разных контекстов потоков, и мне нравится избегать кода сложно.
спасибо за любую помощь
Как вы говорите, что ничего не посылаете? –
Две строки '* ((DWORD *) & pTxBuffer [0]) = 0x11223344; строки являются креативными. Вы можете использовать 'char pTxBuffer [8] = {0x44, 0x33, 0x22, 0x11};' для того же эффекта. – zneak
@UlrichEckhardt, вопрос говорит, что Wireshark ничего не видит. – zneak