У меня есть сервер, который создает поток для каждого клиента. Это функция потока, где моя программа ожидает отправки данных. Мне нужно как-то закрыть эту ветку, если в течение 5 секунд данные не отправляются. Я попытался с этой комбинацией сигнал / тревога, и как-то работает, но функция остальной нити продолжает печатать ошибки, потому что sClient (сокет) закрыт. Как я могу сделать эту работу, или, возможно, другое решение?
void time_out() {
char r = "-1";
printf("Time out");
send(sClient, &r, 10, 0);
close(sClient);
}
void* thread(void *arg) {
sClient = (int)arg;
int size;
char* buffer = (char*)malloc(300);
signal(SIGALRM, time_out);
alarm(5);
if (recv(sClient, (char*)&size, sizeof(int), 0) < 0) {
printf("Error when getting length \n");
}
....
}
Похоже, вы должны открыть поток, подождать 5 секунд, а затем проверить sClient для данных. Если данных нет, то вы можете немедленно закрыть ветку. В противном случае, если есть данные, вы можете вызвать recv, чтобы получить данные.
Для этого вы можете использовать select
вызов с таймаутом для проверки новых данных в сокете.
(Увидеть «Тайм-аут сокета: работает, но почему и как, в основном функция select ()?» на сколько select
с таймаутом работает.)
Других решений пока нет …