Тайм-аут обработки в клиент-серверной программе C - PullRequest
1 голос
/ 08 марта 2011

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

void closeClient() {
    int nr = close(conn);
    if (nr == 0)
       printf("Client connection closed.\n");
    else {
      printf("Error while closing client connection. Error code: %d\n",errno);
      exit(1);
    }
    exit(0); // Process ends after serving the client
}

void time_out(int signal) {  
    printf("Time out.\n");

    char* msg = "Time out.Connection to server is closed\n\0";
    send(conn, msg, strlen(msg),0);
    closeClient(conn);  
    exit(1);
}

Проблема в том, что клиент печатает сообщение («Тайм-аут. Соединение с сервером закрыто») только в том случае, если он пытается что-то отправить на сервер (после того, как соединение уже закрыто). Я не могу понять, почему. Некоторые предложения?

1 Ответ

0 голосов
/ 08 марта 2011

Может быть, вы могли бы использовать select () и задать для него значение тайм-аута в последнем аргументе?

Что-то вместе:

fd_set readset;
struct timeval timeout = {10, 0}; // 10 sec. timeout
FD_ZERO( &readset)
FD_SET( conn, &readset);
int status = select( conn+1, &readset, NULL, NULL, &timeout);
if(status == 0) // timeout reached
{
   // close conn
}
else if(status == -1)
{
   // handle error
}
else
{
   // data ready to be received
   status = read(conn, ....);
}

Обязательно проверяйте возвращаемые значения каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...