套接字编程之接口(2)

简介: 套接字:socket(插座、接口)的翻译,通常表示的是系统提供给程序员实现网络通信的一套接口,为啥封装这些接口呢?因为我们知道,网络通信中有很多的协议, 所以在这套接口中就提供了足够充足的选择。我们通常使用的主要是两个协议的通信程序编写:传输层的TCP和UDP协议。

具体操作接口介绍


创建套接字


  #include<sys/types.h>
  #incldue<sys/socket.h>
  int socket(int domain, int type, int protocol);

domain:地址域类型(具体用的是哪种方式,不同的方式有不同的地址结构:ipv4,ipv6,域间通信)

重点记住AF_INET,比较常用

image.png

  1. type:套接字类型
    注意:两种套接字不能混用,你创建的是哪种协议就要用哪个参数
  2. image.png
  3. protocol:协议类型
    注意:默认使用0,则表示使用套接字类型对应的默认协议,注意记住以下俩种:
    (1)IPPROTO_TCP: 值是6
    (2)IPPROTO_UDP:值是17
  4. image.png
  5. 成功返回一个套接字描述符,失败返回:-1;

为套接字绑定地址信息


  int bind(int socket, const struct sockaddr *address,socklen_t address_len);
1.sockfd:返回套接字的描述符
2.addr:要绑定的地址信息(不同地址域类型有不同的地址结构,故需要一个通用的地址结构)

通用地址结构:

 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.

image.png

注意:

 1.IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址

 2.IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.

 3.socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;


sockaddr 结构


image.png


sockaddr_in 结构


image.png


image.png

虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP地址.


in_addr结构


image.png

in_addr用来表示一个IPv4的IP地址. 其实就是一个32位的整数

typedef uint32_t in_addr_t
in_addr_t inet_addr(cosnst char*ip); 

功能:将点分十进制字符串ip地址转化为网络字节序的整数ip地址 ,如:将192.168.2.2->0x0202a8c0

const char *inet_ ntoa(struct in_ addr addr);
功能:将网络字节序整数P地址, 转换为一个点分 十进制字符串地址
struct in_ addr{
  in_ addr_ ts _addr;
}

image.png

发送数据


  ssize_ t sendto(int sockfd, void *buf, size_ _t dlen, int flag, struct sockaddr *peer,socklen_ t alen);

解释:


1.sockfd: socket返回的套接字描述符

2.buf:要发送的数据空间起始地址

3.dlen:要发送的数据长度,从buf地址开始, 发送dlen长度的数据

4.peer设置的是谁的地址,数据就发给谁,peer:对端地址信息,描述了数据要发送给谁

5.flag:默认0- 阻塞发送(发送缓冲区数据满了就等着)

6.alen:对端地址信息长度

7.**返回值:**成功返回实际发送数据字节长度;失败返回-1


接收数据

接收数据

  ssize_ .t recvfrom(int sockfd, void *buf, size. t dlen, int flag, struct sockaddr *peer, socklen _t *alel

解释:


1.sockfd:套接字描述符

2.buf:空间起始地址,接收到的数据就被放入到buf空间中

3.peer用于获取地址信息,peer中存的是谁,数据就是谁发送给我的,peer这个参数是在recvfrom函数中设置的,我们不用设置。peer:接收数据的同时,得直到数据是谁发的,因此这里的peer是个输出参数,用于返回对端地址信息

4.dlen:想要接收的数据长度

5.flag:默认0-阻塞接收(socket接收缓冲区中没有数据就阻塞,直到有数据)

6.alen:地址信息长度,也是一个输入输出参数,表示想要接收的地址信息长度,以及实际得到的地址信息长度

7.返回值:成功返回实际接收到的数据长度;失败返回-1


*注意:凡是涉及到获取地址信息的操作,地址信息都是socklen _t 类型的


关闭套接字


  int close(int fd)

字节序相关接口


主机字节序到网络字节序的转换: uint32_ t htonl(uint32 _ t val); uint16 t htons(uint16_ t val);

网络字节序到主机字节序的转换: uint32_ t ntoh(uint32 _ t val); uint16 _ t ntohs(uint16_ t val);

注意:

 这几个接口中已经进行了主机字节序的判断,因此不需要担心自己的主机字节序,32位数据转换接口,与16转换接口,不能混用

混用出错例子:

image.png

目录
相关文章
|
传感器 监控
基于STM32的智能交通灯控制系统设计与实现
基于STM32的智能交通灯控制系统设计与实现
1857 0
|
API Windows
PetitPotam——另一种方式触发Windows主机认证
PetitPotam——另一种方式触发Windows主机认证
|
存储 运维 监控
阿里云对象存储 OSS 发布全球第一可用性 SLA 背后的技术体系
2020年6月,阿里云对象存储 OSS 通过十年积累的技术红利,将可用性 SLA(Service Level Agreement) 提升 10 倍,做到了全球第一的核心竞争力,是其他的云厂家的 10~20 倍,如下图所示。
2826 0
阿里云对象存储 OSS 发布全球第一可用性 SLA 背后的技术体系
|
关系型数据库 流计算 PostgreSQL
关于PostgreSQL逻辑订阅中的复制状态
关于PostgreSQL逻辑订阅中的复制状态
3476 0
|
JSON API 数据格式
小红书商品列表API数据解析(附代码)
本内容介绍了小红书商品列表API的用途及调用方式,适用于电商分析与市场研究。接口支持HTTP GET请求,返回JSON格式商品信息,包含标题、价格、销量、商家名称等字段。文中提供了基于Python的完整请求示例,使用requests库实现,并包含请求头设置和参数传递方式,便于开发者快速集成与测试。
|
存储 缓存 JSON
如何在类Web开发范式中使用File存储方式进行状态持久化?
如何在类Web开发范式中使用File存储方式进行状态持久化?
|
10月前
|
人工智能 算法 安全
世优科技携手摩尔线程发布全国产AI数字人解决方案,释放数字经济潜能
摩尔线程首届MUSA大会在京举行,世优科技发布与摩尔线程联合打造的“AI数字人全国产化解决方案”,实现从GPU算力到应用层全栈自主可控。方案搭载自研波塔4.0智能体,支持多模态交互、情感表达与轻量化部署,成本降低25%-40%,助力政务、教育、文旅等场景智能化升级,共建安全可信的数字人生态。
466 0
|
SQL 搜索推荐 Java
什么是笛卡尔积及其在SQL查询中的应用
什么是笛卡尔积及其在SQL查询中的应用
|
JavaScript 前端开发 开发者
Element-UI快速入门
Element-UI快速入门Element-UI快速入门
1726 0
Element-UI快速入门
|
传感器 监控 安全
预防非法访问
【8月更文挑战第19天】
687 7

热门文章

最新文章