Почему нельзя привязать службу linux только к обратной петле? - PullRequest
3 голосов
/ 08 января 2011

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

struct sockaddr_in bind_addr;

memset(&bind_addr,0,sizeof(bind_addr));
bind_addr.sin_family = AF_INET;
bind_addr.sin_port = 0;
bind_addr.sin_addr.s_addr = htonl(inet_addr("127.0.0.1"));
rcd = ::bind(
   socket_handle,
   reinterpret_cast<struct sockaddr *>(&bind_addr),
   sizeof(bind_addr));

Возвращаемое значение для этого вызова bind () равно -1, а значение errno равно 99 (Невозможно назначить запрошенный адрес). Это сбой, потому что inet_addr () уже возвращает свой результат в сетевом порядке или есть какая-то другая причина?

Ответы [ 2 ]

4 голосов
/ 08 января 2011

inet_addr следует избегать, поскольку существует более разумный метод построения struct sockaddr s (что означает, что он также устаревает gethostby*):

#include <netdb.h>

/* Error checking omitted for brevity */
struct addrinfo hints = {.ai_flags = AI_PASSIVE};
struct addrinfo *res;
getaddrinfo("::1", NULL, &hints, &res); /* or 127.0.0.1 if you are 60+ */
bind(fd, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
3 голосов
/ 08 января 2011

Это ошибка, потому что inet_addr () уже возвращает свой результат в сетевом порядке

Да.

Так что уберите вызов htonl.

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