socket编程初探(一)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值