网络编程示例之网络socket程序编程

注意:学习资料可在ElfBoard官方网站“资料”专区获取。

本节用到的源码路径:ELF 1开发板资料包->03-例程源码->03-1 命令行例程源码->05_elf1_cmd_net

tcp协议程序

tcp_server.c

服务端仍然是按照如下顺序进行编写:

socket()//创建套接字;

bind()//分配套接字地址;

listen()//等待连接请求状态;

accept()//允许连接;

read()/write()//进行数据交换;

close()//断开连接;

需要注意我们在检测建立链接的客户端IP是否与设置的相同时没有做判别,将接收所有IP请求建立链接。下面我们看下详细解释:

func_detect_tcp_server_link(int fd): 检测 TCP 服务端连接状态的函数。它接受一个文件描述符 fd,通过调用 getsockopt 函数获取与该文件描述符相关的 TCP 连接信息,并判断连接状态是否为已建立(TCP_ESTABLISHED)。如果连接状态为已建立,则返回 0;否则返回-1。

func_create_tcp_server_listen(int *fd, unsigned int listen_port): 建立 TCP 服务端监听的函数。它接受一个指向监听文件描述符的指针 fd,以及监听的端口号 listen_port。函数首先创建一个套接字,并将其设置为非阻塞模式。然后,通过调用 bind 函数将套接字绑定到指定的端口上,并通过调用 listen 函数开始监听客户端请求。如果操作成功,返回 0;否则返回-1。

func_tcp_server_accept(int listen_fd, int *fd, char *ip): TCP 服务端与客户端建立连接的函数。它接受一个监听文件描述符 listen_fd,一个指向连接文件描述符的指针 fd,以及一个用于 IP 过滤的客户端 IP 地址 ip。函数通过调用 accept 函数接受客户端的连接请求,并检查建立连接的客户端 IP 是否与设置的 IP 相同。如果 IP 相同,将连接文件描述符赋值给 fd,并返回1;否则返回0。

func_tcp_server_receive(int fd, char *p_receive_buff, int count): TCP 服务端接收数据的函数。它接收一个连接文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及最大接收长度 count。函数通过调用 recv 函数接收数据,并返回实际接收到的数据长度。

func_tcp_server_send(int fd, char *p_send_buff, int count): TCP 服务端发送数据的函数。它接收一个连接文件描述符 fd,一个指向发送数据缓冲区的指针 p_send_buff,以及发送数据的长度 count。函数首先调用 func_detect_tcp_server_link 函数检测连接状态,如果连接已断开,则返回 -1。然后通过调用 write 函数将数据发送给客户端,并返回实际发送的数据长度。如果发送的数据长度与指定的长度不一致,表示发送过程中出现错误,返回-1。

func_close_tcp_server_listen(int listen_fd): TCP 服务端关闭监听的函数。它接收一个监听文件描述符 listen_fd,并调用 close 函数关闭监听。

func_close_tcp_server_link(int fd): TCP 服务端关闭连接的函数。它接收一个连接文件描述符fd。

tcp_client.c

func_detect_tcp_client_link(int fd): 检测 TCP 客户端连接状态的函数。它通过获取套接字的 TCP 状态信息,判断连接是否已经建立。如果连接状态为 TCP_ESTABLISHED(已建立连接),则返回 0;否则返回 -1。

func_create_tcp_client_link(int *fd, char *ip, unsigned int port): TCP 客户端与服务端建立连接的函数。它接受一个指向文件描述符的指针 fd,一个服务端 IP 地址字符串 ip,以及服务端端口号 port。函数首先创建一个套接字,然后设置服务器地址结构,尝试与服务端建立连接。如果连接成功,返回 0;连接失败返回 -1。

func_tcp_client_receive(int fd, char *p_receive_buff, int count): TCP 客户端接收数据的函数。它接收一个文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及最大接收长度 count。函数通过调用 recv 函数接收数据,并返回实际接收到的数据长度。

func_tcp_client_send(int fd, char *p_send_buff, int count): TCP 客户端发送数据的函数。它接收一个文件描述符 fd,一个指向发送数据缓冲区的指针 p_send_buff,以及发送数据长度 count。函数首先调用 func_detect_tcp_client_link 检测连接状态,如果连接断开,则返回 -1。否则,调用 write 函数发送数据,并返回实际发送的数据长度。

func_close_tcp_client_link(int fd): TCP 客户端关闭连接的函数。它接收一个文件描述符 fd,并调用 close 函数关闭连接。

udp协议程序

udp_server.c

func_create_udp_server(int *fd, unsigned int listen_port): UDP 服务端创建监听文件描述符的函数。它接受一个指向文件描述符的指针 fd,以及 UDP 服务端监听的端口号 listen_port。函数首先创建一个套接字,然后将其设置为非阻塞模式。接下来,设置服务器地址结构并绑定套接字和端口。如果操作成功,返回 0;否则返回 -1。

func_udp_server_receive(int fd, char *p_receive_buff, int count, char *ip, unsigned int *port): UDP 服务端接收数据的函数。它接收一个文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,数据最大接收长度 count,以及用于存储客户端 IP 和端口号的变量 ip 和 port。函数通过调用 recvfrom 函数接收数据,并返回实际接收到的数据长度。同时,将客户端的 IP 和端口号存储到 ip 和 port 变量中。

func_udp_server_send(int fd, char *p_send_buff, int count, char *ip, unsigned int port): UDP 服务端发送数据的函数。它接收一个文件描述符 fd,一个指向发送数据缓冲区的指针 p_send_buff,发送数据长度 count,以及目标客户端的 IP 和端口号 ip 和 port。函数通过调用 sendto 函数将数据发送给指定的客户端。

func_close_udp_server(int fd): UDP 服务端关闭连接的函数。它接收一个文件描述符 fd,并调用 close 函数关闭连接。

udp_client.c

func_create_udp_client_link(int *fd, char *ip, unsigned int port): UDP 客户端创建文件描述符的函数。它接受一个指向文件描述符的指针 fd,UDP 服务端的 IP 地址 ip,以及 UDP 服务端的端口号 port。函数首先创建一个套接字,然后将其设置为非阻塞模式。如果操作成功,返回 0;否则返回 -1。

func_udp_client_receive(int fd, char *p_receive_buff, int count): UDP 客户端接收数据的函数。它接收一个文件描述符 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及数据最大接收长度 count。函数通过调用 recvfrom 函数接收数据,并返回实际接收到的数据长度。

func_udp_client_send(int fd, char *p_send_buff, int count, char *ip, unsigned int port): UDP 客户端发送数据的函数。它接收一个文件描述符 fd,一个指向发送数据缓冲区的指针。        

p_send_buff发送数据长度 count,以及 UDP 服务端的 IP 和端口号 ip 和 port。函数通过调用 sendto 函数将数据发送给指定的服务端。

func_close_udp_client_link(int fd): UDP 客户端关闭连接的函数。它接收一个文件描述符 fd,并调用 close 函数关闭连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12667.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

标准的渠道治理方法

在当今竞争激烈的市场环境中,品牌的渠道管理犹如一座大厦的基石,至关重要。而其中,对渠道价格的治理更是关键环节,直接关系到品牌的生死存亡与长远发展。 当品牌渠道中不幸出现低价、窜货链接时,一场关乎品牌未来走向…

双指针算法的妙用:提高代码效率的秘密(3)

双指针算法的妙用:提高代码效率的秘密(3) 前言: 小编在昨日讲述了关于双指针算法的两个题目,今日继续分享两个题目的解析,我相信,我只要坚持每天啥刷题,算法能力终究会提高的&…

动力商城-03 Idea集成apifox Mybatis-Plus字段策略

1.Idea下载apifox插件 2.新建令牌放入Idea 3.右键上传到对应接口 4.设置前置url 插件能够自动识别swagger注解 Mybatis-Plus字段策略 1、FieldStrategy作用 Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时,根据配置的策略判断是否对实体对…

11.11--final关键字和抽象类

一 java 1.final 关键字-----放在 访问修饰符后面 1)防止被继承 2)防止 父类方法 被重写 3)防止 类中的 属性 被修改 4)防止 局部属性 被修改 1.2.细节 1)final 修饰属性 必须赋初值 ------------------------------…

IntelliJ+SpringBoot项目实战(三)---基于源代码直接生成漂亮的接口文档

在SpringBoot中可以集成代码插件自动生成接口文档,而且生成的文档很漂亮,除了接口功能介绍、传入参数、响应参数,还具体类似postman的功能,可调用接口进行测试,另外还可以下单WORD版、.md,html格式的文档。下面我们先看…

TemplatesImpl 在Shiro中的利用链学习1

一、前言 在前面的学习中,我们学习了CC1、CC6链,其中CC1链受限于Java8u71版本,而CC6则是通杀的利用链;后来又将 TemplateImpl 融入到 CommonsCollections 利用链中,绕过了 InvokerTransformer 不能使用的限制&#xf…

中仕公考:2025年省考请注意!

打算参加25年省考的考生们注意啦!如果打算参加2025年公务员省考,从这个时间点开始备考刚刚好,如果还不知道怎么备考的,看这篇就够了! 省考流程: 网上报名——资格审查——确认缴费——查看报名序号——准考证打印——笔试——成…

开发RAG应用,你必须知道的7个Embedding模型

在自然语言处理(NLP)领域,Embedding模型是将文本数据转化为数值向量的核心技术,从而让计算机能够便捷地衡量文本间的语义关联,这种表示法已成为多种基础NLP任务的核心,如文本相似度判定、语义搜索、信息检索…

基于Java+SpringBoot学生成绩管理系统

一、作品包含 源码数据库设计文档全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库&…

Kong API网关,微服务架构中,你看到就不想错过的选型

今天,很多公司都采用微服务架构来处理复杂业务,但随着服务数量增加,API管理成了一项繁重任务。Kong API网关,作为一款高性能的开源API网关,给开发者带来了极大便利。它不仅可以简化API的调用和管理,还拥有丰…

计算机毕业设计 | springboot+vue汽车修理管理系统 汽修厂系统(附源码)

1,项目背景 在如今这个信息时代,“汽车维修管理系统” 这种维修方式已经为越来越多的人所接受。在这种背景之下,一个安全稳定并且强大的网络预约平台不可或缺,在这种成熟的市场需求的推动下,在先进的信息技术的支持下…

使用京东API接口进行支付结算有哪些注意事项?

用京东API接口进行支付结算时,需要注意以下几个事项: 遵守京东开放平台规定:在使用京东API接口时,必须遵守京东开放平台的相关规定,不得滥用接口或进行非法操作。 保护用户隐私:为了保护用户隐私&#xff…

全国宪法宣传周答题活动怎么做

在12月4日全国宪法宣传周即将到来之际,越来越多的企业单位开始举办线上知识竞赛答题活动,以下是一个知识竞赛答题小程序的基本功能: 一、了解活动信息:确定答题活动的开始时间、结束时间以及是否分阶段进行等。不同的答题活动时…

【debug】QT 相关问题error汇总 QT运行闪退 QT5升级到QT6注意要点

总结一下碰到过的所有问题error以及解决方案 如果这个文档未帮助到你,仍有bug未解决,可以在下方评论留言,有偿解决。 qt的UI更新之后构建后发现没有变化 取消项目中的Shadow build的勾选,作用是取消影子构建,此后构建目…

信捷 PLC C语言 POU 指示灯交替灭1秒亮1秒

1.在全局变量表中定义2个定时器变量timer1,timer2 名称 类型 timer1 TMR_FB False -- False False timer2 TMR_FB False -- False False ot BOOL False -- False False ot表示指示灯 2.新建pou…

【Linux进程篇3】说白了,Linux创建进程(fork父子进程)也就那样!!!

--------------------------------------------------------------------------------------------------------------------------------- 每日鸡汤:没人可以好运一生,只有努力才是一生的护身符,不放弃、不辜负。 -----------------------…

使用服务器时进行深度学习训练时,本地必须一直保持连接状态吗?

可以直接查看方法,不看背景 1.使用背景2. 方法2.1 screen命令介绍2.2 为什么要使用screen命令2.3 安装screen2.4 创建session2.5 查看session是否创建成功2.6 跳转进入session2.7 退出跑代码的session2.8 删除session 1.使用背景 我们在进行深度学习训练的时候&…

防火墙笔记地十二天

1.IPSEC协议簇 IPSEC协议簇 --- 基于网络层的,应用密码学的安全通信协议组 IPV6中,IPSEC是要求强制使用的,但是,IPV4中作为可选项使用 IPSEC可以提供的安全服务 机密性 --- 数据加密 完整性 --- 防篡改 可用性 数据源鉴别 -…

即时设计:Sketch的云端版本控制

设计师们经常面临的一个挑战是设计软件的频繁更新,尤其是Sketch这类流行工具。每次更新可能会修复一些旧bug并增加新功能,但同时也可能导致与旧版本的不兼容问题,尤其是在不同工作环境中的电脑性能差异可能导致文件兼容性问题。那么&#xff…

什么是网络安全CTF有何意义?该如何入门?

什么是网络安全CTF?有何意义 ?该如何入门 ? 什么是网络安全CTF? CTF在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。它起源于1996年DEFCON,以代替之前通过互相发起真实攻击进行技术比拼的方式。发展至今&#xff…