当前位置: 首页 > news >正文

UDP-网络编程/socket编程

一,socket相关接口

1,socket

我们来介绍socket编程的第一个接口:socket,它需要用到的头文件如图:

其中domain表示域或者协议家族:

本次我就用AF_INET(ipv4)来做演示

type参数表示用什么通讯方式,我们用udp来演示,所以使用SOCK_DGRAM:

protocol平时使用我们都传零就行目前来说

我们再看看socket的返回值:

可以看到,socket返回值是一个文件描述符,socket本质就是创建了一个文件

2,bind

bind头文件及其需要的参数如下:

scokfd参数就是在socket创建成功之后的返回值(文件描述符)sockaddr是一个结构体指针addrlen是该结构体的大小。

sockaddr和addrlen维护在一个sockaddr_in里面,这时我们知道,在使用bind填充网络信息时并没有写入内核,只是把数据维护到一个结构体里

3,sockaddr_in

对sockaddr_in转到定义之后我们可以看到两个参数:sin_port(服务器的端口号),sin_addr,(服务器的ip地址)我们对SOCKADDR COMMON转到定义可以看到:

此参数要传入对应的协议家族。

在传入参数前,我们可以使用bzero来将其初始化:

bind的返回值小于零代表绑定失败,大于零代表成功。

4,recvfrom

该函数可以接收别人发送过来的消息

sockfd就是socket的返回值(文件描述符),*buf就是接收数据的容器,len就是最长接收数据的量,flags,目前我们将其设置成零,表示默认行为:非阻塞,src_addr是一个输出型参数,可以接受是谁发的消息,addrlen就是src_affr的大小,其返回值大于零代表接受成功。

5,sendto

sendto是 Linux 系统中用于发送数据的系统调用,主要用于无连接套接字(如 UDP 套接字)。它的作用是将数据发送到指定的目标地址,参数和上面的大差不差就不重新解释了。

6,转换字节序

1. htonl
作用: 将 32 位整数(如 IPv4 地址)从主机字节序转换为网络字节序。
hostlong: 主机字节序的 32 位整数。
返回值: 网络字节序的 32 位整数。

2. htons
作用: 将 16 位整数(如端口号)从主机字节序转换为网络字节序。
hostshort: 主机字节序的 16 位整数。
返回值: 网络字节序的 16 位整数。

3. ntohl
作用: 将 32 位整数(如 IPv4 地址)从网络字节序转换为主机字节序。
netlong: 网络字节序的 32 位整数。
返回值: 主机字节序的 32 位整数。

4. ntohs
作用: 将 16 位整数(如端口号)从网络字节序转换为主机字节序。
netshort: 网络字节序的 16 位整数。
返回值: 主机字节序的 16 位整数n。

字节序说明
主机字节序: 可能是大端序(Big-Endian)或小端序(Little-Endian),取决于 CPU 架构。
网络字节序: 统一为大端序(Big-Endian),这是网络协议的标准。

7,点分十进制系列转换

1. inet_aton
作用**: 将点分十进制格式的 IPv4 地址字符串(如 192.168.1.1)转换为网络字节序的二进制值,并存储到 `struct in_addr` 结构中。
特点:
与 inet_addr 类似,但更安全,因为它使用 `struct in_addr` 来存储结果,而不是返回一个可能被误解的值。
成功时返回 1,失败时返回 0。
支持所有有效的 IPv4 地址格式,包括特殊地址(如255.255.255.255)。

2. inet_addr
作用: 将点分十进制格式的 IPv4 地址字符串(如 192.168.1.1)转换为 32 位的网络字节序的二进制值。
特点:
返回值为 in_addr_t类型(通常是 uint32_t)。
如果输入的字符串无效,返回 INADDR_NONE(通常是 -1)。
已经被标记为过时,推荐使用 inet_aton 或 inet_pton。

3. inet_ntoa
作用: 将网络字节序的二进制 IPv4 地址(struct in_addr)转换为点分十进制格式的字符串。
特点:
返回一个指向静态缓冲区的指针,该缓冲区存储转换后的字符串。
由于使用静态缓冲区,该函数不是线程安全的。
适用于简单的调试或非并发场景。

4.inet_lnaof
作用: 从 struct in_addr 中提取主机部分(本地网络地址部分)的二进制值。
特点:
假设输入的 IPv4 地址是分类网络地址(如 A 类、B 类、C 类)。
返回值为主机部分的二进制值(主机字节序)。
在现代网络中,由于 CIDR(无类别域间路由)的广泛使用,此函数的使用场景有限。

5.inet_netof
作用: 从 `struct in_addr` 中提取网络部分(网络地址部分)的二进制值。                                      特点:
假设输入的 IPv4 地址是分类网络地址

返回值为网络部分的二进制值

二,基于网络接口写一个客户给服务端发消息的案例(使用udp)

相关文章:

  • 【K8s】专题十六(3):Kubernetes 包管理工具之 Helm 语法
  • Excel 中如何实现数据透视表?
  • 信奥赛CSP-J复赛集训(模拟算法专题)(9):P6437 [COCI 2011/2012 #6] JACK
  • 数据库系统概论(二)数据模型
  • 记录--有惊无险
  • 产城融合典范:树莓科技如何助力宜宾数字经济腾飞​
  • 自启动、关联启动的拦截规则
  • 4g串口发短信踩坑
  • 【文件系统】
  • C语言for循环语句的用法(非常详细)
  • Ubuntu 源码安装 Qt5
  • 报错E0513:不能将 “const wchar_t *“ 类型的值分配到 “LPWSTR“ (aka “wchar_t *“) 类型的实体
  • 【性能测试入门_01性能测试jmeter基础实操场景详解】
  • # 如何确认elementary os (linux)使用的是Wayland而不是x11?
  • TCP连接过程图解
  • Android Compose是如何使用什么架构,多个Activity?还是Fragment?compose的ui又是如何卸载和挂载的呢?
  • 【day10】智慧导览:学习LBS定位精度标准
  • markdown转docx
  • Java基础关键_020_集合(四)
  • 电网电压暂态扰动机理与工业设备抗失压防护策略研究
  • 新疆交通运输厅厅长西尔艾力·外力履新吐鲁番市市长候选人
  • 专访|西蒙·斯特朗格:以“辞典”的方式讲述二战家族史
  • 菲律宾举行中期选举
  • 射箭世界杯上海站摘得两银,中国队新周期冲击韩国缩小差距
  • 中国词学研究会原会长、华东师大教授马兴荣逝世,享年101岁
  • 开局良好,我国第一季度广告业务收入保持较快增速