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);
有用。但為什么它以這種方式作業而以另一種方式卻沒有?
uj5u.com熱心網友回復:
我的英語不是很好,所以請理解。
請參見gethostbyname() 手冊頁。
gethostbyname() 函式為給定的主機名回傳一個 hostent 型別的結構。這里的 name 是標準點表示法中的主機名或 IPv4 地址(如 inet_addr(3))。如果 name 是 IPv4 地址,則不執行查找,gethostbyname() 只是將 name 復制到 h_name 欄位中,并將其等效的結構 in_addr復制到回傳的主機結構的 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]
結構 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");
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389453.html
