Обработка ошибок отправки и возврата в C - PullRequest
0 голосов
/ 05 мая 2019

Я новичок в языке C и пишу TCP-сервер

// create a socket, bind and listen
while(1) {
 accept:
 int conn_sock = accept(...);
 // here some recv and send calls
}

Я хочу предотвратить отключение сервера, если произошло ECONNRESET или EINTR.Если одна из этих ошибок возникает при отправке или получении данных, я хочу перейти к принятию (хочу перейти к метке accept, если по какой-то причине также не удается выполнить accept()).

Если я не улавливаю эти ошибки, мой сервер перестает работать, если клиент закрывает соединение.

Как я могу перехватить эти ошибки и вернуться к принятию, чтобы установить соединение с другим клиентом?

1 Ответ

1 голос
/ 05 мая 2019

При ошибке accept() возвращает -1.Тогда причина ошибки может быть прочитана из errno.

Один из возможных подходов таков:

  int errno_accept;
  while (1)
  {
    errno_accept = 0;
    int accepted_socket = accept(...);
    if (-1 == accepted_socket)
    {
      errno_accept = errno;
      switch(errno_accept)
      {
        case EINTR:
        case ECONNRESET: /* POSIX does *not* define this value to be set 
                       by a failed call to accept(), so this case is useless. */

        default:
          /* Catch unhandled values for errno here. */

          break; /* Treat them as fatal. */

        ...
  } /* while (1) */

  if (0 != errno_accept)
  {
    /* Handle fatal error(s) here. */
  }
...