Сокеты UNIX: Как проверить, закрыт ли поток TCP для чтения или EOF? - PullRequest
0 голосов
/ 12 апреля 2011

Я пишу простой клиент, который читает двоичные данные через поток TCP.Поскольку файл отправляется по частям, у меня есть цикл, похожий на этот:

while (1 /* Maybe a check for EOF or if the socket is closed here ? */) {
  ssize_t bytes_red = recv(
  if (bytes_read <= 0) // not working properly ?
    break;
  ...
}

Чтение выполняется с помощью метода recv (), который возвращает количество полученных байтов.Идея, очевидно, состоит в том, чтобы читать данные, пока открыт поток TCP, но кажется, что описанный выше подход не работает для меня.

Есть еще идеи?Как правильно читать из сокета до тех пор, пока поток не будет закрыт или EOF не обнаружен?

EDIT : Приведенный выше подход работает нормально, в другом месте была ошибка.

1 Ответ

4 голосов
/ 12 апреля 2011

recv() возвращает 0, если сокет был правильно закрыт, и -1, если произошла ошибка.Итак, вы читаете, пока recv() не вернет <=0.Ваш опубликованный фрагмент кода выглядит правильно - почему вы думаете, что он не работает для вас?Что происходит, что вы ожидали?

Если ваш сокет неблокирующий, вам также придется обрабатывать случай, когда recv() возвращает -1, а errno имеет значение EAGAIN или * 1009.*.Это означает, что сокет все еще жив и здоров, но сейчас больше нет данных.

...