通過上面的討論,若是咱們想要鏈接到遠程的服務器,咱們須要知道對方的IP地址,系統函數gethostbyname
便可以實現這個目的。它可以獲取域名對應的IP地址而且返回一個hostent
類型的結果。其中包含了IP地址信息,他的頭文件爲netdb.h
。linux
struct hostent { char *h_name; // 主機名 char **h_aliases; // 別名列表 int h_addrtype; // 地址類型 int h_length; // 地址的長度 char **h_addr_list; // 地址列表 }
其中的h_addr_list
即是存放IP地址的信息。編程
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/socket.h> #include<arpa/inet.h> #include<sys/types.h> #include<netdb.h> int main() { char *hostName = "www.baidu.com"; char ip[100]; struct hostent *host; struct in_addr **addr_list; int i; if (NULL == (host = gethostbyname(hostName))) { perror("get host by name error"); exit(1); } addr_list = (struct in_addr **)host->h_addr_list; for (i = 0; addr_list[i] != NULL; i++) { // inet_ntoa()將long類型的IP地址轉化爲圓點的字符串形式,做用與inet_addr()相反 strcpy(ip, inet_ntoa(*addr_list[i])); } printf("%s resolved to: %s", hostName, ip); return 0; }
gethostbyname()
用來獲取域名對應的IP地址。能夠參加gethostbyname()來查看更過的用法。服務器
由前面可以知道accept()
返回的是結構體sockaddr_in
,由此很容易得知對方的IP和端口信息。socket
char *client_ip = inet_ntoa(client.sin_addr); int client_port = ntohs(client.sin_port);
到如今爲止,咱們已經接觸了多個重要的類型。函數
sockaddr_in
鏈接信息。用在connect
send
recv
等中。in_addr
long類型的IP地址。sockaddr
與sockaddr_in
相似,是通用的socket鏈接信息。hostent
域名對應的IP信息。用在gethostbyname
。