Несколько пакетов UDP в сокете

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

Сможет ли это сделать сервер, если за 0,1 секунды придет 10 пакетов? Другими словами, может ли он отправить новый пакет каждому клиенту сразу после обработки первого полученного пакета? (У меня такое ощущение, что сокет будет "забит" 9 другими непрочитанными пакетами)

Цикл сервера будет таким:

while (1) {
    read_a_packet()
    process_packet()
    send_new_packet_to_all_clients()
}

person user990814    schedule 12.10.2011    source источник


Ответы (2)


Входящие пакеты UDP помещаются в буфер для последующего извлечения. Если ваша обработка достаточно медленная, чтобы заполнить буфер сокета пакетами, следующие пакеты будут просто отброшены.

См. Также Как происходит переполнение буфера сокета Linux? и Очередь пакетов сокетов UDP C ++ (также проверьте комментарии там).

person Roman R.    schedule 12.10.2011
comment
Меня не интересует заполнение буфера, а вот что: если буфер сокета заполнен частично, что произойдет, когда я попытаюсь отправить пакет? - person user990814; 12.10.2011
comment
Вы можете быть обеспокоены потерей пакетов, когда буфер заполнен. Что касается отправки пакетов - вы можете отправлять их в любое время, независимо от состояния входа сокета. - person Roman R.; 12.10.2011
comment
Хорошо спасибо. На самом деле цифры, которые я назвал, были преувеличением; в моем приложении время обработки в целом намного меньше, чем время между полученными пакетами, но я хотел знать, что могло бы случиться, если бы один пакет был получен во время обработки другого. - person user990814; 12.10.2011

По вашему собственному определению, выполнение process_packet() занимает 1 секунду. Поток может делать только одну вещь за раз, поэтому такому серверу с зацикливанием в одном потоке потребуется 10 секунд, чтобы обработать 10 пакетов. Так что либо ускорьте process_packet() до менее 1 секунды, либо запустите несколько потоков обработки, чтобы можно было обрабатывать несколько пакетов параллельно.

person Remy Lebeau    schedule 12.10.2011