C语言IP地址知识

转载 2016年08月30日 19:05:18

在做服务器开发的时候,需要使用到ip地址。现在基本上服务器都是在ipv4版本里面。本文主要介绍的就是ipv4的方式。
struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。

数据结构定义

sockaddr

struct sockaddr {
        sa_family_t     sa_family;    /* address family, AF_xxx       */
        char            sa_data[14];    /* 14 bytes of protocol address */
}

sa_family :是2字节的地址家族,一般都是“AF_xxx”的形式,它的值包括三种:AF_INET,AF_INET6和AF_UNSPEC。
如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。
AF_UNSPEC则意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。

sockaddr_in

struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

sin_family:指代协议族,在socket编程中只能是AF_INET
sin_port:存储端口号(使用网络字节顺序)
sin_addr:存储IP地址,使用in_addr这个数据结构

in_addr

/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};

s_addr是个int32的数字;ipv4。

sockaddr_in6

           struct sockaddr_in6 {
               sa_family_t     sin6_family;   /* AF_INET6 */
               in_port_t       sin6_port;     /* port number */
               uint32_t        sin6_flowinfo; /* IPv6 flow information */
               struct in6_addr sin6_addr;     /* IPv6 address */
               uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */
           };

in6_addr

           struct in6_addr {
               unsigned char   s6_addr[16];   /* IPv6 address */
           };

函数

endian相关

       uint32_t htonl(uint32_t hostlong);
       uint16_t htons(uint16_t hostshort);
       uint32_t ntohl(uint32_t netlong);
       uint16_t ntohs(uint16_t netshort);

这些函数很容易背,h=host,n=network,s=short,l=long。
在做网络操作的时候一定要注意自己本地字节序和网络字节序差别。

ip地址转换工具

int inet_aton(const char *cp, struct in_addr *inp);
struct sockaddr_in adr_inet;
if( !inet_aton("127.0.0.1", &adr_inet.sin_addr))
 char *inet_ntoa(struct in_addr in);
 str_addr = inet_ntoa(session->sin.sin_addr);

C语言—判断IP地址是否合法

判断输入的IP地址是否合法 #include unsigned long ip; int judge(int ,int ,int ,int); void main() { char *ipst...
  • huihuang1515
  • huihuang1515
  • 2015年07月11日 21:56
  • 2040

如何用C语言获得本机IP地址?(获取一个ip或者获取所有ip)

我们可以在cmd中敲入ipconfig来获取本机ip地址,下面写个程序来获取本机ip地址(结果相同): #include #include #pragma comment(lib,"ws2_32.li...
  • stpeace
  • stpeace
  • 2013年09月30日 00:07
  • 19131

C语言实现字符串IP与整数型IP的相互转换

#include #include #include #include int main(int argc,char *argv[]) { const char *ip ="192.16...
  • u010003119
  • u010003119
  • 2014年09月07日 17:22
  • 3411

Linux下C语言获取和修改本机IP地址

/** 头文件*/#ifndef _GET_IP_H #define _GET_IP_H extern char *get_ip(char *ip); extern int set_hand_ip(...
  • lihuibo128
  • lihuibo128
  • 2015年02月09日 10:35
  • 2334

Linux下C编程实现---获取本机IP地址

在LINUX下,如果需要获取本机的IP地址,需要用到以下一个结构体,该结构体在/usr/include/net/if.h文件中struct ifreq { # define IFHWADDRLEN...
  • Timsley
  • Timsley
  • 2016年04月05日 09:28
  • 2448

C语言检查本机公网IP并发送邮件

 #include #include #include #include #include #include #define N 500 using namespace std; #...
  • yangyangsnr
  • yangyangsnr
  • 2014年05月19日 05:08
  • 1360

在linux下c语言获取本机ip地址源代码

getip.c - 在linux下c语言获取本机ip地址源代码 rhel5.4-i386 bash-3.2-24.el5.src.rpm  http://oss.oracle.com/el5/S...
  • beatle_1983
  • beatle_1983
  • 2014年11月14日 10:38
  • 1646

Linux C语言 获取本机(所有网卡)IP地址(IPV4)

1、根据ioctl机制打印当前所有网卡 代码: #include #include #include #include #include #...
  • yangguangmeng
  • yangguangmeng
  • 2014年04月28日 18:38
  • 3456

华为面试题:识别有效的ip地址和子网掩码并分类 C语言源码

识别有效的ip地址和子网掩码并分类: 按行输入多组数据 10.8.9.2~255.0.0.0 180.8.9.2~255.254.0.0 打印:A B C D E 错误的ip或掩码 私有ip 的个...
  • hepfei90
  • hepfei90
  • 2015年03月05日 09:06
  • 1829

Problem D: IP地址 题目编号1301

这个D题我查过博客,好像是山科大第二届acm校赛的题( I 题 )。 代码在下面:http://blog.csdn.net/ronggerace/article/details/45420461 ...
  • Galaxy_12138
  • Galaxy_12138
  • 2017年12月26日 20:03
  • 20
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言IP地址知识
举报原因:
原因补充:

(最多只允许输入30个字)