#sockets #winsock #serversocket #winsock2
Вопрос:
Я использую WSARecvFrom
вызов для приема пакетов UDP на сервере UDP. Наблюдение таково: когда я использую несколько потоков, производительность WSARecvFrom
ухудшается. Каковы факторы, связанные с потоковой передачей, которые влияют на производительность сокета и WSARecvFrom
? Каковы рекомендации по внедрению UDP-сервера, используемого WSASocket
в случае высокой пропускной способности (~4000 пакетов в секунду).
Обновить
Constructor(...)
{
io = CreateThreadpoolIo(SocketHandle, IOCompletion, ...);
for(i -> 0 to number_of_parallel_receives)
ReceivePacket(...);
}
static void CALLBACK IOCompletion(...)
{
ProcessPacket(...);
IncrementCounter();
ReceivePacket(...); // get next packet
}
void ReceivePacket(...)
{
StartThreadpoolIo(io);
WSARecvFrom(...); // callback routine is nullptr and handled with the ThreadPoolIO callback
}
Комментарии:
1. Как вы оцениваете производительность? Как выглядит ваш код?
2. Обновленный. Наблюдение состоит в том, что, когда я даже отключаю обработку,
IOCompletion
я все равно получаю меньше чисел в счетчике с большимWSAReceiveFrom
количеством параллельных очередей.3. Здесь действительно недостаточно информации или кода, чтобы ответить на этот вопрос, но… Попробуйте использовать IOCP вместо предупреждающего ввода-вывода? Для более позднего требуется, чтобы поток находился в «состоянии ожидания с возможностью оповещения» для доставки обратного вызова…