В общем целиком поддерживаю
Smithson и
Олег Цилюрик
Проверяйте коды ошибок, возвращаемые методами передачи/приема. При работе с сетью всегда нужно закладываться на то, что передача или прием пройдет с ошибкой или будут приняты/переданы не все данные.
Т.е. фактически вы должны писать программу исходя из того что ошибки приема/передачи не то что возможны, а они точно будут всегда.
И да, кастомные keep-alive для TCP - это полная фигня - в протоколе уже все реализовано.