В общем проблема вот в чем:
Есть клиент (Windows). Он подключается к серверу (Linux), отсылает ему 17 байт ЗА ОДИН SEND!!!
У сервера стоит TCP_DEFER_ACCEPT на сокет (30 сек). т.е. логика такая, что accept сработает как только придет первый пакет данных от клиента или пока не истечет время 30 сек.
И так вот - работает всё отлично. Если клиент за 30 сек не отправил данные, то значит это не правильный клиент.
Ну так вот, проблема в том, что сервер после accept делает:
Len = recv(Sock, &Pack, sizeof(PACKET), MSG_NOSIGNAL | MSG_DONTWAIT);
У меня логика такая:
- После коннекта клиента буфер отправки на клиенте пуст и по этому 17 байт вместит точно.
- Так как все 17 байт отправляются за один send то значит 100% они попадут в буфер и не разобьются.
- Размер 17 байт по любому меньше размера окна TCP и размера буфера отправки, по этому по идее уйдут они в одном TCP пакете
- Сервер за счет TCP_DEFER_ACCEPT ждет появления данных.
- Как только пришли данные, то они считываются без блокирования сокета. Так как мы сразу знаем сколько данных придет и что они будут в одном tcp пакете то они всегда должны быть целиком получены, но увы на деле не так.
В 10% случаях данные считываются именно 14 байт, а не 17. Может дело в какой-то настройке в Linux ? Причем глюки начинаются когда идет нагрузка на сервер.