打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
网络编程里几个结构 in

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。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Windows Socket API 使用经验 - 技术文档 - VC文档 - 网络通讯 - 立华软件园
用Socket编程之TCP/IP通信,你会了吗?
Berkeley套接字
网络socket编程指南
Linux环境下的Socket编程 - C&C - Linux技术中坚站
socket头文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服