История изменений
Исправление 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;
}
опять же сервер имеет право рвать коннект, если ты гонишь ему неверный протокол или он тебя в чем-то подозревает например. это его право.. верней тех, кто его писал.