2010-04-06 5 views
3

Я разрабатываю небольшой процессор данных в C++ поверх сокетов UDP и имею поток (только один и отдельно от сокетов), обрабатывающий полученную от них информацию.C++ Winsock неблокирующий/async UDP-сокет

Моя проблема возникает, когда мне нужно получать информацию от нескольких клиентов в сокете одновременно.

Как я мог бы сделать что-то вроде:

Socket foo; 
/* init socket vars and attribs */ 
while (serving){ 
thread_processing(foo_info); 
} 

для нескольких клиентов (много одновременного доступа) в C++?

Я использую winsocks atm на win32, но просто получаю стандартную блокировку сокетов udp. Нет gui, это консольное приложение. Я по достоинству оценю пример или указатель на один;).

Заранее спасибо.

ответ

1

UDP-сокет может принимать дейтаграммы от нескольких клиентов с помощью функции recvfrom(). Просто заблокируйте прием, прочитайте запрос, обработайте его, отправьте ответ, повторите. Вам даже не нужен поток, если обработка занимает очень много времени (в этом случае будет работать поток, связанный с двумя очередями, внутри и снаружи).

0

Я бы предположил, что это лучше всего решить, помещая запросы в очередь и позволяя другому потоку работать в очереди. Это отделяет прием сокета от процесса и, таким образом, позволяет масштабировать до большего количества слушателей и обрабатывать потоки, если ваши требования меняются.