//UdpSocket - мой класс, простая обертка над сокетамиvoid Send(UdpSocket *to, uint8_t *data, ssize_t size){ int len = 1000; int seek = 0; while(seek != size) { udpSocket->SendTo(to, &data[seek], len); seek += len; // HERE GOES DELAY }}
void Loop(){ /* Все переменные объявлены в классе, проинициализированы ранее */ if(!GetQueuedCompletionStatus(_main_io, &dwBytes, &key, (LPOVERLAPPED *)&lpOverlapped, INFINITE)) { Log("Error!"); //Тоже отдельная функция return; } /* ... */ UdpSocket *udpSocket= (UdpSocket *)lpOverlapper->pData; /* ... */ //Вызываю событие (тоже собственного писания) while(WSARecvFrom(udpSocket->_sock, &udpSocket->_wsaBuf, 1, &dwBytes, &udpSocket->_socketFlags, (sockaddr *)&udpSocket->_addr, &udpSocket->_len, &udpSocket->_wsaOverlapped, 0) == 0) { udpSocket->OnRecvFrom((uint8_t *)udpSocket->_wsaBuf.buf, (int &)dwBytes, (sockaddr *)&udpSocket->_addr, udpSocket->_len); } if(WSAGetLastError() != WSA_IO_PENDING) { Log("Error: WSAGetLastError() != WSA_IO_PENDING = %i", WSAGetLastError()); return; }}