У меня есть очень надоедливая проблема, которую я несколько раз встречал на других форумах, но не могу найти правильного решения. Проблема в том, что recv() возвращает 0 в последних нескольких байтах соединения. Вот некоторая справочная информация.
Я вызываю send() несколько раз (небольшими порциями), и со стороны клиента передается 53 байта. Сервер несколько раз вызывает recv() (запросы по 4 байта) и читает 49 байт, а затем возвращает 0 (54 байта - 49 байт, поэтому 4 байта отсутствуют).
MSDN и некоторые форумы пишут для неблокирующих сокетов:
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% соединений успешны. Любые идеи? Спасибо.