1、由于项目要求实现自动化测试,但是在自动化测试RF库中没有现成的库可以使用,就必须自己封装库来用。
2、本人主要使用的是DNS协议,使用UDP 消息,说道发包就不得不用socket进行操作,今天本文就以socket作为论述的重点
套接字编程需要指定套接字的地址作为参数,不同的协议族有不同的定义方式,但往往都以sockaddr开头
不同的协议对应着不同的后缀如sockaddr_in 以太网的地址, sockaddr_un unix网络的套接字地址
通用套接字接口
typedef unsigned short sa_family_t ;
struct sockaddr{
sa_family_t sa_family ; //协议族
char sa_data[14] ; //协议族数据
}
由此可见通用套接字的大小为16个字节
这个数据结构只是通用的数据,实际编程中大家需要使用特定的数据结构来强制转换
比如常用的以太网中的sockaddr_in其数据结构如下
struct sockaddr_in{
u8 sin_lem ; //socketaddr_in 结构体的长度
u8 sin_family ; //通常为AF_INET
u16 sin_port; //16位端口号,网络字节序
struct in_addr sin_addr ; //ip地址32位
char sin_zero[8] ; //未用
}
struct in_addr{
u32 s_addr ; //32位IP地址,网络字节序
};
sockaddr_in 和sockaddr有着相同的长度,但是sockaddr_in 有着更明确的参数,在实际使用的时候通常强制转换成socketaddr结构,
由于大小完全相同不会出现副作用
比如说服务器绑定端口的函数
int bind (int sockfd , /*套接字的文件描述*/
const struct sockaddr *my_addr, /*强制转换套接字地址结构*/
socklen_t addrlen ); /*套接字地址结构的长度*/
这种转换是由Linux操作系统内核进行操作的用户只要传入想要测参数即可,
在网络交互过程中是由socket()函数来获取文件描述的
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol) ;
在实际使用中第三个参数需要依据特定的协议来进行设定
主要依据type的类型
比如
in fd= socket(AF_INET,SOCK_DGRAM,0)UDP协议,
UDP协议就没有connect过程就不会有SOCK_SEQPACKET过程,因此第三个参数只能为0