Промежуточное сетевое оборудование (кто сказал что будут только роутеры?) может делать с пакетами все что угодно ;-)) Сам видел.
Знаю, знаю стандарты и все такое.. однако может быть все что угодно. Еще и Оська чудить может (гы, будет). Вот из этого и надо исходить.1. Поэтому надо отказаться от неблокируемых сокетов - плохая идея.
Это ж непрерывное переключение контекста...
2. Использовать select/poll . Чтоб не висеть если ничего не придет.
3. Написать функцию оболочку ReceivePack для функции recv()
Пусть получает на вход еще и таймаут. И ее использовать для приема пакетов. Сильно схематично:
// Получает полностью блок данных заданного размера len,
// либо ошибку, либо таймаут.
int ReceivePack(int fd, void *buf, int len, int timeout)
{
// bla bla bla
// читаем пока не вычитаем весь блок заданной длины len,
// иначе вылетаем по тайму - соединение в ауте
for (int size = 0, r_len = 0; size < len; size += r_len) {
r_len = 0; // гы
select(...); // Ждем появления данных, иначе
// селект вернет либо ошибку, либо тайм
// тайм - return 1;
// ошибка - return -1;
if (данные мона читать?) { // FD_ISSET(...) == ...
// читаем блок
r_len = recv(fd, buf, len - size,...);
if (r_len < 0) {
// ошибка либо прерывание сигналом, либо что-то тяжелое :-((
//
return -1;
}
}
}
return 0; // прочитан весь блок. Зачет
}
4. Сделать то же самое для send() обязательно. Были случаи на производстве....
Стивенс. "Сетевое программирование". Узнаете столько нюансов ;-))