网络编程里几个结构
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
![](http://image55.360doc.com/DownloadImg/2012/09/1017/26744607_1.png)
![](http://image55.360doc.com/DownloadImg/2012/09/1017/26744607_2.png)
![](http://image55.360doc.com/DownloadImg/2012/09/1017/26744607_3.png)
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。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
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
![](http://image55.360doc.com/DownloadImg/2012/09/1017/26744607_1.png)
![](http://image55.360doc.com/DownloadImg/2012/09/1017/26744607_2.png)
![](http://image55.360doc.com/DownloadImg/2012/09/1017/26744607_3.png)
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。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
相关文章推荐
- 每日安全简讯20160722
- win10下tomcat9配置http2.0笔记
- MFC中网络编程,利用套接字的过程。
- [置顶] 《TCP/IP卷》读书笔记
- 网络请求中的cookie与set-Cookie的交互模式和作用
- volley+okhttp封装,一行代码就可访问网络
- golang的HTTP基本认证机制实例详解
- 卷积神经网络(CNN)的参数优化方法
- eclipse配置tomcat,访问http://localhost:8080出现404错误
- NetRouter mt7620 mt7688 网络资料
- 第一章 计算机网络概述(笔记)
- 只为成功找方法,不为失败找借口! javaweb学习总结(十)——HttpServletRequest对象(一)
- win10无法启动承载网络
- Java网络编程 Internet地址
- HTTP Status Code
- golang网络socket粘包问题的解决方法
- AFNetworking网络请求-数据请求(POST/GET)
- python网络爬虫抓取图片
- HTTP 验证 Tomcat中进行基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)
- 模拟http 的请求工具汇总