Текущее состояние сокета определяется активностью keep-alive. В вашем случае это возможно, что при выполнении вызова send
действие keep-alive
сообщает, что сокет активен, и поэтому вызов send
записывает необходимые данные (40 байт) в буфер и возвращается без каких-либо ошибок.
Когда вы отправляете больший блок, отправляющий вызов переходит в состояние блокировки.
Страница man send также подтверждает это:
Когда сообщение не помещается в буфер отправки сокета, send () обычно блокируется, если сокет не был переведен в неблокирующий режим ввода-вывода. В неблокирующем режиме он возвращает EAGAIN в этом случае
Таким образом, при блокировке свободного доступного буфера, если вызывающий абонент уведомляется (с помощью механизма keep-alive), что другой конец больше не присутствует, вызов send не будет выполнен.
С указанной информацией сложно предсказать точный сценарий, но я считаю, что это должно стать причиной вашей проблемы.