1. есть некоторое большое приложение (не мною писаное)
2. оно открывает TCP/IP соединение и читает из сокета с помощью recv
3. читает таким образом что блокируется до тех пор пока не придут данные (без таймаута чтения)
4. Если соединение неожиданно обрывается ( как я понимаю соединения обрывается по инициативе удалённой машины ввиду отсутствия взаимодействия ) то чтение продолжает висеть .. я не могу раскопать всех частей приложения но само чтение выглядит примерно так:
Код: Выделить всё
int ret;
threadEntry_t self;
fdEntry_t *fdEntry = getFdEntry(s);
if (fdEntry == NULL) {
errno = EBADF;
return -1;
}
do {
startOp(fdEntry, &self);
ret = recv(s, buf, len, 0);
endOp(fdEntry, &self);
} while (ret == -1 && errno == EINTR);
return ret;Вопрос: может ли быть такое чтобы recv не возвращал управление при каких-то флагах установленных для сокета? может ли быть такое чтобы при обрыве этот цикл зациклился?
Ситуация усложняется тем что я не знаю какой именно тип обрыва произошёл (пришёл ли TCP-пакет на обрыв или же просто удалённая машина "замолчала")
Внешние проявления таковы что приложение не заметило что сокет оборвался.
Может кто сталкивался с таким?
И к этому коду коммент:
Код: Выделить всё
* perform a blocking IO operation. Restarts
* automatically if interrupted by signal (other than
* our wakeup signal)