Как обрабатывать подключение errno в программировании сокетов cpp

#c #macos #sockets #network-programming

Вопрос:

Я новичок в сетевом программировании и в настоящее время следую руководству Биджа, чтобы ознакомиться с этим контентом.

Когда книга знакомила getaddrinfo() меня с функцией, в ней рассказывалось об использовании gai_strerror() для интерпретации кода ошибки, возвращаемого в читаемые строки. Однако в книге не рассматривается метод обработки ошибок для connect() , и мне интересно, существует ли аналогичная функция, которая выполняла бы ту же работу, что gai_strerror() и для getaddrinfo() чего ?

Вот мой код:

     if((status=connect(sockfd, res->ai_addr, res->ai_addrlen)) != 0){
        fprintf(stderr, "connect: %sn", function_to_be_used(status));

        return 2;
    }
 

Комментарии:

1. @AlexF Большое вам спасибо за ваш комментарий! Теперь я, наконец, узнал, что функция на самом деле передает код ошибки errno вместо того, чтобы возвращать его.

2. perror("connect") также может быть полезно в качестве быстрого способа записи строки ошибки, связанной с errno, в stderr.

3. На самом деле это зависит от платформы. Например, в Windows нет errno или strerror() / perror() , но поставщики библиотек времени выполнения могут предоставлять свои собственные эквиваленты. В программировании WinSock, поскольку стандарта не существует errno , ошибки сокетов сообщаются WSAGetLastError() и могут быть переведены в строки с помощью FormatMessage() .

Ответ №1:

Из connect ссылки на функцию:

Если соединение или привязка выполняются успешно, возвращается ноль. При ошибке возвращается значение -1, и значение errno указывает на ошибку.

Итак, вам нужен следующий код:

 fprintf(stderr, "connect: %sn", strerror(errno));
 

getaddrinfo обработка ошибок-это своего рода исключение, большинство API настроены errno на ошибку, которую можно преобразовать в сообщение об ошибке с помощью strerror .

Комментарии:

1. fprintf() Показанное равносильно простому вызову perror("connect") вместо этого, который выведет то же самое сообщение на stderr.