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

Linux udp编程

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
    ====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
    ====> |||《C#专栏》::记录我复习C#的经历,深度理解查漏补缺,不定期更新。|||
    ====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||

Linux udp编程

  • udp通信原理
  • udp通信接口
    • socket创建
    • 网络通信结构体
    • bind port和ip
    • 接收信息接口
    • 发送信息接口
  • 其他网络接口

udp通信原理

udp是用户数据报协议不面向链接的不可靠传输。
udp协议使用socket进行通信,socket包含两个部分:(ip-port),可以表示网络中的某个主机和某个进程。

udp通信服务端建立如下
1).创建socket。
2).将socket和本地ip和port,bind。
3).使用recvfrom,sendto接口,接收,发送信息。
udp客户端建立如下
1).创建socket。
2).本地隐式将sokcet和本地ip和port绑定。
3).使用recvfrom,sendto接口,接收,发送信息。

udp通信接口

支持udp通信接口较多。

socket创建

socket接口如下


参数1:domain,决定通信域,其接收一些宏,如AF_INET(ipv4),AF_INET(ipv6),同时也可以基于udp进行域间通信,还可以进行网络管理,还可以跨网络通信。
参数2:type,决定套接字通信类型,依旧接收一个宏,如SOCK_DGRAM,及代表数据报通信。
参数3:protocol,当前两个参数决定后,该参数传递0。
retval:返回一个socket值,socket在底层是一个文件描述符,上层的进程就是通过该描述符通信的,类似于打开网卡。

当domain = AF_INET,type = SOCK_DGRAM代表udp通信。

网络通信结构体

struct sockaddr,struct sockaddr_in,struct sockaddr_un。
在这里插入图片描述
sockaddr是父类接口,其他接口是子类接口,在使用的时候,我们都使用sockaddr_in/sockaddr_un,但是在使用参数的时候,为了保证可以通用一个接口,在接口参数设计的时候,都使用的是sockaddr。
1).sockaddr_in:用于网络间通信,其结构体如下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在该结构体中,存在sin_port,sin_addr(结构体),sin_family(指定通信域)。

bind port和ip

bind接口如下

在这里插入图片描述
参数1:sockfd,传入一个sock文件描述符,代表绑定某个socket。
参数2:addr,传入当地的,要绑定的ip和端口号,在服务端,sockaddr_in中,我们一般不绑定一个确定的ip,而通过宏INADDR_ANY,来代表当前主机。
参数3:addrlen,将参数2的大小算出,传入其中。
retval:小于零,代表bind函数错误。

接收信息接口

recvfrom接口如下

在这里插入图片描述
参数1:sockfd,从那个sockfd中接收信息。
参数2:buf,将接收到的信息放入buf中。
参数3:len,代表buf中的有效个数。
参数4:flag,一般传入0.
参数5:src_addr,为了能够在接收信息后,知道信息的发送方,传入一个输出参数。
参数6:addrlen,该参数的类型是一个自定义类型,其实代表无符号整型,该参数就是传入该类型的指针。
retval:返回收到的内容的字节数。

发送信息接口

sendto接口如下

在这里插入图片描述
参数1:sockfd,从那个sockfd中接收信息。
参数2:buf,将发送的信息放入buf中,发送出去。
参数3:len,代表buf中的有效个数。
参数4:flag,一般传入0.
参数5:dest_addr,发送信息的目的sockaddr。
参数6:addrlen,其实代表无符号整型,直接传入一个值。

其他网络接口

在udp通信中还存在许多网络接口,如网络字节序转换接口,ip字符串到4字节相互转换接口,清空内存空间接口等等。
1).网络字节序转换接口
各个主机的字节序不同,有的主机是大端字节序,有的主机是小端字节序,为了确定内容在网络中的传递,在网络中传递的数据都是通过大端字节序传递的,所以在主机中,我们要通过网络通信,就要将传递的结构体内容转为大端。
在这里插入图片描述
2).ip字符串到4字节相互转换接口
在客户端,我们需要传递信息,就必须知道目的ip和port,需要将字符串ip转换为32位数字ip,
存在以下接口
在这里插入图片描述
inet_aton接口,将点分十进制字符ip转换为in_addr的4字节ip,返回值0,失败,非0,成功。
在这里插入图片描述
接口inet_ntoa,将4字节ip转换为字符串ip,该接口返回字符串的地址,该接口存在线程安全问题,该接口内部会在同一个静态区创建一个字符串,并且返回它的地址,所以多线程并发访问时,会造成线程安全问题。
3).清空内存空间接口
在使用struct sockaddr_in/struct sockaddr_un接口时,需要清空内存空间,就可以使用bzero接口。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Efficient Estimation of Word Representations in Vector Space论文笔记解读
  • 【学习笔记】4、组合逻辑电路(下)
  • 小程序自学教程
  • Android 内部保持数据的方式
  • 前端Canvas入门——一些注意事项
  • AC修炼计划(AtCoder Regular Contest 179)A~C
  • python的简单爬取
  • Python面试题:如何在 Python 中解析 XML 文件?
  • PyFluent入门之旅(5)后处理
  • LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结
  • Typescript 中bind的使用
  • 后端登录校验——Filter过滤器和Interceptor拦截器
  • 【架构】分布式与微服务架构解析
  • 京准电钟|ptp精密时钟服务器在网络内作用是什么?
  • k8s record 20240710 监控
  • [译] React v16.8: 含有Hooks的版本
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017 年终总结 —— 在路上
  • 78. Subsets
  • C++11: atomic 头文件
  • CSS居中完全指南——构建CSS居中决策树
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • emacs初体验
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript 基本功--面试宝典
  • Java多线程(4):使用线程池执行定时任务
  • jQuery(一)
  • JSONP原理
  • JWT究竟是什么呢?
  • October CMS - 快速入门 9 Images And Galleries
  • redis学习笔记(三):列表、集合、有序集合
  • session共享问题解决方案
  • SQLServer之创建显式事务
  • vue--为什么data属性必须是一个函数
  • WePY 在小程序性能调优上做出的探究
  • 飞驰在Mesos的涡轮引擎上
  • 关于 Cirru Editor 存储格式
  • ------- 计算机网络基础
  • 记一次删除Git记录中的大文件的过程
  • 开源地图数据可视化库——mapnik
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 线性表及其算法(java实现)
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (4) PIVOT 和 UPIVOT 的使用
  • (C11) 泛型表达式
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)PySpark3:SparkSQL编程
  • (黑马C++)L06 重载与继承