recv() возвращает 0

У меня есть очень надоедливая проблема, которую я несколько раз встречал на других форумах, но не могу найти правильного решения. Проблема в том, что recv() возвращает 0 в последних нескольких байтах соединения. Вот некоторая справочная информация.

  • Оба приложения (клиент/сервер) работают на одном компьютере.
  • Оба сокета (клиент/сервер) неблокирующие
  • Размер передаваемых данных 53 байта.
  • Оба (клиент/сервер) вызывают shutdown и closesocket при выполнении последней функции send()/recv().
  • Я также пробовал с SO_LINGER и 10 секундами, тоже безуспешно

Я вызываю send() несколько раз (небольшими порциями), и со стороны клиента передается 53 байта. Сервер несколько раз вызывает recv() (запросы по 4 байта) и читает 49 байт, а затем возвращает 0 (54 байта - 49 байт, поэтому 4 байта отсутствуют).

MSDN и некоторые форумы пишут для неблокирующих сокетов:

  • recv() определенно возвращает
  • recv() определенно возвращает = 0, когда другая сторона закрыла соединение
  • recv() определенно возвращает > 0 при чтении данных

MSDN также говорит:

Использование функций closesocket или shutdown с SD_SEND или SD_BOTH приводит к отправке сигнала RELEASE по каналу управления.Должное использование банкоматом отдельных каналов сигналов и данных, возможно, что сигнал RELEASE может достичь удаленного конца до того, как последний из данные достигают места назначения, что приводит к потере этих данных. Один возможным решением является программирование достаточной задержки между последним данные отправлены, и функция closesocket или shutdown вызывает банкомат разъем.

Это рассматривается на примере recv() и send(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85). aspx

Но все еще безуспешно, я все еще получаю некоторые прерывания в 10% всех соединений после получения 49 байтов, 90% соединений успешны. Любые идеи? Спасибо.

6
задан HelloWorld 10 May 2012 в 01:26
поделиться