Linux下的C Socket編程(二)
獲取域名對應的IP地址
經過上面的討論,如果我們想要連接到遠程的服務器,我們需要知道對方的IP地址,系統函數gethostbyname
便能夠實現這個目的。它能夠獲取域名對應的IP地址並且返回一個hostent
類型的結果。其中包含了IP地址信息,他的頭文件為netdb.h
。
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()來查看更過的用法。
從socket連接中獲取對方IP
由前面能夠知道accept()
返回的是結構體sockaddr_in
,由此很容易得知對方的IP和端口信息。
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
。