recv не отправляет мне -1 на клиентском сокете close () - PullRequest
1 голос
/ 04 апреля 2011

СЕРВЕР-КОД

...
client_socket = accept(server_socket, (struct sockaddr *) &client_address,     &client_address_len);
...
for (;;) {
    if ( recv(client_socket, recived_buffer, MAX_MSG_LENGTH, 0) < 0 ) {
        perror("ERROR leyendo el socket");
        exit(1)
    }
}

если я убью клиента, сервер зависнет на неопределенный срок ...

Любой совет?

Ответы [ 2 ]

11 голосов
/ 04 апреля 2011

Когда клиент закрывает соединение, на стороне сервера recv() вызов вернет значение 0.

Из recv(2) manpage:

Возвращаемое значение

Эти вызовы возвращают количество полученных байтов или -1, если произошла ошибка.Возвращаемое значение будет равно 0, когда одноранговый узел выполнил упорядоченное завершение.


Также может быть важно отметить, что вызов recv() будет блокироваться до тех пор, покаданные доступны для чтения.Если вы не хотите блокировать, вы должны обязательно установить неблокирующее сокет или использовать select() или poll(), чтобы увидеть, есть ли входящие данные перед вызовомrecv().

2 голосов
/ 04 апреля 2011

recv возвращает 0 - когда узел закрывает соединение, другая часть интерпретирует его как EOF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...