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

Linux下的C Socket編程(二)

獲取域名對應的IP地址

通過上面的討論,若是咱們想要鏈接到遠程的服務器,咱們須要知道對方的IP地址,系統函數gethostbyname便可以實現這個目的。它可以獲取域名對應的IP地址而且返回一個hostent類型的結果。其中包含了IP地址信息,他的頭文件爲netdb.hlinux

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和端口信息。socket

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
相關文章
相關標籤/搜索