socket编程初探(一)

    xiaoxiao2021-03-25  142

    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

    转载请注明原文地址: https://ju.6miu.com/read-3849.html

    最新回复(0)