Буферизация потоковых данных - PullRequest
2 голосов
/ 14 мая 2010

Я пытаюсь разработать простой IRC-бот. Сначала я хочу придумать правильный дизайн для этого проекта. Одна из вещей, которые меня интересуют сейчас - это механизм чтения. Я разрабатываю этого бота в системе Linux. (Fedora 12) Для чтения из сокета я использую системный вызов read (). Я планирую использовать функцию чтения следующим образом (код только пример. Не что-то из конечного продукта):

while (uBytesRead = read(iServerSocket, caBuffer, MAX_MESSAGE_SIZE))
{
   //1. Parse the buffer and place it into a Message structure.
   //2. Add the message structure to a linked list that will act as a queue of message that are to be processed.
}

Этот код будет выполняться в своем собственном потоке. Я выбрал этот вариант, потому что хотел, чтобы задержка между чтениями была как можно меньше. (записи будут реализованы таким же образом). Все это немного основано на предположениях, которые я хотел бы прояснить. Мой вопрос: что, если вы получаете столько данных с такой высокой скоростью, что чтение и обработка данных (в данном случае просто их анализ) идет медленнее, чем скорость поступления данных. Я сделал предположение, что эти данные будет буферизован системой. это правильное предположение? И если так:

  1. Насколько велик этот буфер?
  2. Что происходит с поступающими данными, когда этот буфер заполняется?
  3. Чтобы мое приложение было защищено от спама, как мне лучше всего с ним бороться?

Надеюсь, я достаточно ясно объяснил свою проблему.

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

1 Ответ

1 голос
/ 14 мая 2010

IRC использует TCP-сокеты для работы в сети. В сокетах Linux / Posix TCP имеется буфер данных для отправки и еще один для приема. Вы можете изменить размер буферов с помощью setsockopt () и SO_SNDBUF / SO_RCVBUF.

TCP имеет управление потоком, поэтому, когда приемный буфер заполняется, ОС отправляет уведомление о перегрузке. Полученные пакеты, которые не поместились в буфере, не будут подтверждены получателем и в конечном итоге будут переданы отправителем.

Так что не беспокойся. Важно то, что программа-отправитель заполняет при отправке буфера отправки своего сокета. Некоторые программы закрывают сокет, другие просто отбрасывают записанные данные и повторяют попытку, тогда как другие могут выполнять внутреннюю буферизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...