您的位置:首页 > 理论基础 > 计算机网络

网络编程里几个结构

2016-07-22 10:45 302 查看
IP地址结构(注意红色的语句,经常用到)

struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;//注意,这里是一个联合,通常在用的时候用S_addr,就是下面这个红色的
#define s_addr  S_un.S_addr
                                /* can be used for most tcp & ip code */
#define s_host  S_un.S_un_b.s_b2
                                /* host on imp */
#define s_net   S_un.S_un_b.s_b1
                                /* network */
#define s_imp   S_un.S_un_w.s_w2
                                /* imp */
#define s_impno S_un.S_un_b.s_b4
                                /* imp # */
#define s_lh    S_un.S_un_b.s_b3
                                /* logical host */

};

一起来看下一个IP地址的内存中的样子(192.168.21.234):192=0xc0  168=0xa8



 




Socket地址结构

struct sockaddr_in {

        short   sin_family; //2字节,地址族,socket编程中只能是AF_INET

        u_short sin_port; //2字节,绑定的端口(网络字节序)

        struct  in_addr sin_addr; //4字节,IP地址结构(s_addr按照网络字节顺序存储IP地址)

        char    sin_zero[8];//sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

};

struct sockaddr {

        u_short sa_family;              /* address family */

        char    sa_data[14];            /* up to 14 bytes of direct address */

};

(此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

但一般编程中并不直接针对此数据结构操作,而是使用与sockaddr等价的数据结构sockaddr_in,在使用的时候用socketaddr_in开辟变量并定义,然后在使用的时候作类型转换)
pcap_addr地址结构

struct pcap_addr {
struct pcap_addr *next;
struct sockaddr *addr;/* address */
struct sockaddr *netmask;/* netmask for that address */
struct sockaddr *broadaddr;/* broadcast address for that address */
struct sockaddr *dstaddr;/* P2P destination address for that address */

};

IP地址转换

unsingned long inet_addr(const char FAR *p)接受一个常量IP字符串的指针,并返回一个无符号整型值。发生错误时返回-1,和广播地址255.255.255.255相同,故在赋值之前得先检查返回值。

例如:sockaddr_in socketaddress;

            unsigned long ip = inet_addr("192.168.21.234");

            if (ip == -1)

            {  printf("error ocurred!");

              ...

            }

            else

           {   socketaddress.sin_addr.s_addr=ip;

               ... 

           }

char FAR * inet_ntoa(struct in_addr in) 将IP地址结构转换成字符串型IP地址。

 

socket 函数

SOCKET socket( int af, int type, int protocol );

  应用程序调用socket函数来创建一个能够进行网络通信的套接字。

  第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;

  第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据报以及协议首部);

  第三个参数指定应用程序所使用的通信协议。

  该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: