Я пытаюсь установить параметры сокета для клиентского сокета, возвращенного из функции accept()
. Но они не устанавливаются правильно.Настройка sockopt для клиентского сокета, возвращаемого из accept()
Моя цель - тайм-аут клиента после определенного времени бездействия. Но сервер все равно должен принимать другие клиентские соединения.
Ниже приведен мой код, где я устанавливаю параметр сокета. Не могли бы вы предложить, что не так?
while ((new_sock_fd = accept(socket_fd, (struct sockaddr *) &cli_addr, &clilen)) > 0)
{
if (new_sock_fd < 0)
printf("Accept Error");
else
{
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;
if (setsockopt(new_sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
error("setsockopt failed\n");
if (setsockopt(new_sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
error("setsockopt failed\n");
pthread_create(&thread, NULL, client_handler, (void *) (intptr_t)new_sock_fd); //intptr_t is big enough to hold the integer prt
}
}
Как узнать, что параметры не установлены? Ошибка 'setsockopt()' с ошибкой? Возвращает ли 'getsocktop()' значения, которых вы не ожидаете? Разве сокет просто ведет себя иначе, чем ожидалось? Если да, то как? На какой платформе работает этот код? На большинстве платформ SO_RCVTIMEO и SO_SENDTIMEO действительно используют структуру 'timeval' в качестве входных данных. Но в Windows они вместо этого берут 'DWORD'. –
Кроме того, ваше сообщение «Принять ошибку» никогда не будет сообщено, так как ваш цикл входит только в тело цикла, когда 'new_socket_fd> 0'. Если вы хотите выполнить обработку ошибок на 'accept()', вы должны переместить ее внутри цикла. –