#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.