为啥地址信息没有用 gethostbyname 和 inet_pton 函数正确存储?
Posted
技术标签:
【中文标题】为啥地址信息没有用 gethostbyname 和 inet_pton 函数正确存储?【英文标题】:Why address information are not properly stored with gethostbyname and inet_pton functions?为什么地址信息没有用 gethostbyname 和 inet_pton 函数正确存储? 【发布时间】:2022-01-22 22:32:52 【问题描述】:int main (int argc, char **argv)
int sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
bzero(&addr,sizeof addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(9999);
struct hostent *server = gethostbyname("192.168.1.139");
printf("%s %d\n",server->h_addr,inet_pton(AF_INET,server->h_addr,&addr.sin_addr.s_addr));
int res = connect(sockfd,(struct sockaddr *)&addr,sizeof addr);
printf("%d\n",res);
while (1)
char buf[100] = "";
fgets(buf,100,stdin);
send(sockfd,buf,sizeof buf,0);
如果我执行这段代码,我总是会得到:
$ ./client
��� 0
-1
所以:
-
为什么我得到这些随机字符?为什么我看不到 h_addr 的 IP 字符串?
为什么inet_pton的返回值为0?应该是1,0代表不成功,那为什么会失败呢?
显然,连接失败。
另外,如果我不使用 inet_pton,我会使用这一行:
bcopy((char *)server->h_addr,(char *)&addr.sin_addr.s_addr,h_length);
它有效。但是为什么它以这种方式工作而以另一种方式却没有呢??
【问题讨论】:
【参考方案1】:我的英文不太好,请谅解。
见gethostbyname() man page。
gethostbyname() 函数为给定的主机名返回一个 hostent 类型的结构。这里的 name 是标准点表示法的主机名或 IPv4 地址(如 inet_addr(3))。如果 name 是 IPv4 地址,则不执行查找,gethostbyname() 只需将 name 复制到 h_name 字段中,并将其 struct in_addr 等效项复制到返回的 hostent 结构的 h_addr_list[0] 字段中。
h_addr_list[0] 是 struct in_addr,h_addr_list[0] 是 h_addr,见下文。
结构主机
struct hostent
char * h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
;
#define h_addr h_addr_list[0]
struct in_addr
struct in_addr
uint32_t s_addr;
所以,如果要查看 h_addr 的 IP 字符串,请看下面的代码。
printf("%s\n", inet_ntoa(*(struct in_addr*)server->h_addr));
您可以通过将 s_addr 的值分配为 addr.sin_addr.s_addr = *(unit32_t *)server->haddr;
来使用它
或者您可以使用addr.sin_addr.s_addr = inet_addr("192.168.1.139");
使其更简单
【讨论】:
以上是关于为啥地址信息没有用 gethostbyname 和 inet_pton 函数正确存储?的主要内容,如果未能解决你的问题,请参考以下文章
为啥阿凡达变脸器没有用,一直都是显示missing required data
jsp修改地址栏图标 我试过在head中加<link rel=”icon” href=”/favicon.ico”>,但是都没有用。为啥?