Закрытие потока при ожидании данных в recv

У меня есть сервер, который создает поток для каждого клиента. Это функция потока, где моя программа ожидает отправки данных. Мне нужно как-то закрыть эту ветку, если в течение 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");
}

....
}

0

Решение

Похоже, вы должны открыть поток, подождать 5 секунд, а затем проверить sClient для данных. Если данных нет, то вы можете немедленно закрыть ветку. В противном случае, если есть данные, вы можете вызвать recv, чтобы получить данные.

Для этого вы можете использовать select вызов с таймаутом для проверки новых данных в сокете.

(Увидеть «Тайм-аут сокета: работает, но почему и как, в основном функция select ()?» на сколько select с таймаутом работает.)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]