LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

тебе нужно читать как делать таймаут на recv

и хотя у меня есть где-то свой код на это дело, но проще привести из инета

основной смысл в использовании неблокирующего сокета и функций ожидания poll или select на файловых дескрипторах.

ты встаешь в ожидании на неблокирующем сокете с неким таймаутом. из функции (poll/select) ты вернешься или если пришло событие(то есть данные в сокет) или произошла ошибка или закончился таймаут(интервал ожидания)… короче читай доки.

если все нормально - то читаешь из сокета данные, в остальных случаях - сам решаешь что делать.

тут вот обсуждается https://stackoverflow.com/questions/2876024/linux-is-there-a-read-or-recv-from-socket-with-timeout

примерно так -

struct pollfd fd;
int ret;

fd.fd = mySocket; // your socket handler 
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
    case -1:
        // Error
        break;
    case 0:
        // Timeout 
        break;
    default:
        recv(mySocket,buf,sizeof(buf), 0); // get your data
        break;
}

опять же сервер имеет право рвать коннект, если ты гонишь ему неверный протокол или он тебя в чем-то подозревает например. это его право.. верней тех, кто его писал.

по poll смотри ман https://man7.org/linux/man-pages/man2/poll.2.html

Исходная версия alysnix, :

тебе нужно читать как делать таймаут на recv

и хотя у меня есть где-то свой код на это дело, но проще привести из инета

основной смысл в использовании неблокирующего сокета и функций ожидания poll или select на файловых дескрипторах.

ты встаешь в ожидании на неблокирующем сокете с неким таймаутом. из функции (poll/select) ты вернешься или если пришло событие(то есть данные в сокет) или произошла ошибка или закончился таймаут(интервал ожидания)… короче читай доки.

если все нормально - то читаешь из сокета данные, в остальных случаях - сам решаешь что делать.

тут вот обсуждается https://stackoverflow.com/questions/2876024/linux-is-there-a-read-or-recv-from-socket-with-timeout

примерно так -

struct pollfd fd;
int ret;

fd.fd = mySocket; // your socket handler 
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
    case -1:
        // Error
        break;
    case 0:
        // Timeout 
        break;
    default:
        recv(mySocket,buf,sizeof(buf), 0); // get your data
        break;
}

опять же сервер имеет право рвать коннект, если ты гонишь ему неверный протокол или он тебя в чем-то подозревает например. это его право.. верней тех, кто его писал.