У меня есть сервер сокетов, основанный на libev, который получает сообщения от нескольких гнезд одновременных.Ошибка связи со связью libev
Я использую recv() для получения сообщения из сокета. И отправить() для связи с сокетом Проблема заключается в том, что иногда даже если я посыла() и выход посыла()> 0 еще сокет на другой стороне получает ничего
Обваленная вниз версия кода здесь http://pastebin.com/SM7uPkVD
(Большая часть его разрезают вставили из интернета)
проблема заключается в том, что 99% от времени сокет связь работает абсолютно нормально, это всего лишь несколько мест, где это выходит из строя. Есть ли некоторые очевидные вещи, которые мне не хватает
Может ли быть реализация без буфера. Использование другого потока. Таким образом, каждая запись и чтение будут обрабатываться отдельно. – Ram
Это происходит по очень веской причине: сокращение накладных расходов IPC. Вместо того, чтобы пытаться избежать этого, вы должны стремиться использовать его, разбивая несколько запросов из большого количества полученных данных. Это можно сделать, выполнив поиск маркера конца запроса (будет ли '\ n \ r' делать?), Префикс каждого запроса с его размером или просто путем запроса фиксированного размера. – jop
Если размер моих данных невелик (менее 1 килобайта), и я могу контролировать это тоже, что является лучшим способом делать read() или recv(). Должен ли я читать 1 символ времени, ищите «\ r», чтобы закончить покрытие или изменить программу-отправитель, чтобы префикс фиксированной длины длины. – Ram