我正在编写一个服务器应用程序,它将在我只希望在回送接口上访问的临时端口上提供服务。 为了做到这一点,我正在写代码如下:
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()已经按networking顺序返回结果,还是有其他原因?
这是否失败,因为inet_addr()已经按网络顺序返回结果
是。
所以删除htonl电话。
应该避免使用inet_addr
,因为构建struct sockaddr
(这意味着它也过时了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);