Linux下的C Socket編程 -- 獲取對方IP地址


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);

到現在為止,我們已經接觸了多個重要的類型。

  1. sockaddr_in 連接信息。用在connect send recv等中。
  2. in_addr long類型的IP地址。
  3. sockaddrsockaddr_in類似,是通用的socket連接信息。
  4. hostent 域名對應的IP信息。用在gethostbyname


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM