2013-04-04 1 views
0

У меня есть сервер сокетов, основанный на libev, который получает сообщения от нескольких гнезд одновременных.Ошибка связи со связью libev

Я использую recv() для получения сообщения из сокета. И отправить() для связи с сокетом Проблема заключается в том, что иногда даже если я посыла() и выход посыла()> 0 еще сокет на другой стороне получает ничего

Обваленная вниз версия кода здесь http://pastebin.com/SM7uPkVD

(Большая часть его разрезают вставили из интернета)

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

ответ

0

При использовании сокетов SOCK_STREAM нет гарантии, что несколько отправлений приводят к нескольким приемам. В частности, ваш сервер может сразу считывать несколько объединенных запросов в строке 124, а затем отвечать только один раз в строке 135, что заставляет вас думать, что данные теряются. Вы должны проверить, соответствует ли это readlen > 3.

+0

Может ли быть реализация без буфера. Использование другого потока. Таким образом, каждая запись и чтение будут обрабатываться отдельно. – Ram

+0

Это происходит по очень веской причине: сокращение накладных расходов IPC. Вместо того, чтобы пытаться избежать этого, вы должны стремиться использовать его, разбивая несколько запросов из большого количества полученных данных. Это можно сделать, выполнив поиск маркера конца запроса (будет ли '\ n \ r' делать?), Префикс каждого запроса с его размером или просто путем запроса фиксированного размера. – jop

+0

Если размер моих данных невелик (менее 1 килобайта), и я могу контролировать это тоже, что является лучшим способом делать read() или recv(). Должен ли я читать 1 символ времени, ищите «\ r», чтобы закончить покрытие или изменить программу-отправитель, чтобы префикс фиксированной длины длины. – Ram