2009-11-26 3 views
1

Я создаю сервер сокетов. Но я не знаю, как я могу узнать, что клиент отключен или нет? Я создаю сервер под Windows и использую функцию сокетов berkeley (читать, отправлять, подключаться ....). Желательно я хочу кросс-платформенное решение (без WSA-функций).Гнездо: Клиент был отключен или нет?

Я могу записать в сокет 0 байт и ошибку ckeck. Но это нехорошее решение.

+0

Чтение может зависает, если клиент не будет отключен и розетка не имеет данных. Или, может быть, я ошибаюсь. Или я должен использовать неблокированные сокеты? – 2009-11-26 22:04:23

+0

@unick Предполагается, что вы все равно будете читать в цикле для обычного чтения. – asveikau

ответ

4

Когда клиент отсоединяется, вы получите «читать» событие, но и для чтения() возвращает 0.

ssize_t bytes_read; 
if ((bytes_read = read(...)) == 0) 
{ 
    // client disconnected 
} 
else if (bytes_read == -1) 
{ 
    // some sort of error (also no data available when using non-blocking sockets). 
} 
else 
{ 
    // you have bytes_reads bytes to process 
} 
+0

Вы правы, указав EAGAIN, но есть также EINTR, что означает, что ваш процесс получил сигнал во время чтения. Обычно я занимаюсь этим. – asveikau

+1

Также он упомянул, что использует Windows, поэтому ему нужно использовать recv() вместо read(). – asveikau

Смежные вопросы