【5】DongshanPI-Seven 应用开发_网络编程TCPUDP

目录

  • 1、网络编程概念
  • 2、网络编程的API
    • 2.1 网络通信交互示意图
    • 2.2 主要API
  • 3、编程测试
    • 3.1 TCP 测试
      • 3.1.1 server 程序
      • 3.1.2 Client 程序
      • 3.1.3 测试结果
    • 3.2 UDP 测试
      • 3.2.1 udp server
      • 3.2.2 udp client
      • 3.2.3 测试结果

1、网络编程概念

1.数据传输三要素:源、目的、长度。在网络传输中需要使用 IP+端口来表示源和目的。

2.网络传输中的两个对象:server 和 client

  • server:被动响应请求
  • client:主动发起请求

3.两种传输方式:TCP/UDP

  • TCP: 可靠传输
  • UDP:不可靠传输 (传输视频),无连接。

2、网络编程的API

2.1 网络通信交互示意图

1.TCP
在这里插入图片描述

2.UDP
在这里插入图片描述

2.2 主要API


1.创建1个套接字
int socket(int domain, int type, int protocol);
- domain:网络程序所在的主机采用的通信协议族。AF_INET
- type: 网络程序所采用的通信协议.SOCK_STREAM, TCP协议;SOCK_DGRAM,UDP协议。
- protocol:由于指定了type,此值设置为0
- 返回值: 成功,返回文件描述符;失败,返回-1.2.将本地的地址和端口同socket绑定
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
- sockfd:要绑定的套接字描述符
- addr:sockaddr 结构体指针,由于系统兼容性一般使用struct sockaddr_in来代替- struct sockaddr_in{unsigned short sin_family;   unsigned short sin_port;struct in_addr sin_addr;unsigned char sin_zero[8];}sin_family: AF_INETsin_port: 要监听的端口号sin_addr: INADDR_ANY,表示可以和任何的主机通信
- addrlen:sockaddr结构的长度
- 返回值:成功返回0;失败返回-13.启动监测数据
int listen(int sockfd,int backlog);
- sockfd:bind后的文件描述符;
- backlog:请求排队的最大长度。多个client连接时,可以接受的排队数量。
- 返回值:成功返回0;失败返回-14.接受一个连接
int accept(int sockfd, struct sockaddr *addr,int *addrlen);
- sockfd:listen后的文件描述符;
- addr、addrlen:给client程序填写的,server端只要传递指针即可。5. client向server发起一个连接
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
- sockfd:socket函数返回的文件描述符;
- addr:server端的地址和端口信息
- addrlen:sockaddr 的长度
- 返回值:成功返回0;失败返回-16. client/server 发送数据函数
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- sockfd:套接字描述符
- buf:要发送数据缓冲区
- len:实际要发送的数据的字节数
- flags:一般设置为0
- 返回值:成功返回实际发送数据的字节数; 失败返回-17.client/server 接收数据函数
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
- sockfd:套接字描述符
- buf:用于存放接收数据的缓冲区
- len:buf长度
- flags:一般设置为0
- 返回值:成功返回实际接收数据的字节数; 失败返回-18.udp 接收函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
- sockfd:套接字描述符
- buf:用于存放接收数据的缓冲区
- len:buf长度
- flags:一般设置为0
- src_addr:源地址结构体
- addrlen:源地址结构体长度指针
- 返回值:成功返回实际接收数据的字节数; 失败返回-19.udp 发送函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
- sockfd:套接字描述符
- buf:用于存放接收数据的缓冲区
- len:buf长度
- flags:一般设置为0
- src_addr:源地址结构体
- addrlen:源地址结构体长度
- 返回值:成功返回实际发送数据的字节数; 失败返回-1

3、编程测试

3.1 TCP 测试

3.1.1 server 程序

server 程序有1个Client进程连接就创建一个进程。

#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>#define SERVER_PORT 1234
#define BACKLOG		10/* socket* bind* listen* accept* send/recv*/
int main( int argc, char **argv)
{int iSocketServer;int iSocketClient;int iRet;struct sockaddr_in tSocketServerAddr;struct sockaddr_in tSocketClientAddr;int iAddrLen;int iClientNum = -1;int iRecvLen;unsigned char RecvBuf[512];signal(SIGCHLD, SIG_IGN); // 处理client关闭后server僵尸进程iSocketServer = socket(AF_INET, SOCK_STREAM, 0);if(-1 == iSocketServer){printf("socket error!\r\n");return -1;}tSocketServerAddr.sin_family = AF_INET;tSocketServerAddr.sin_port = htons(SERVER_PORT);tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;memset(tSocketServerAddr.sin_zero, 0, 8);iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr,sizeof(struct sockaddr));if(-1 == iRet){printf("bind error!\r\n");return -1;}iRet = listen(iSocketServer, BACKLOG);if(-1 == iRet){printf("listen error!\r\n");return -1;}while(1){iSocketClient = accept(iSocketServer, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);if(-1 != iSocketClient){iClientNum++;printf("Get connect from %d:%s\r\n", iClientNum, inet_ntoa(tSocketClientAddr.sin_addr)); // inet_ntoa缃戠粶鍦板潃杞崲鎴愬瓧绗︿覆if(!fork()){// 瀛愯繘绋嬩唬鐮?while(1){// 鎺ユ敹瀹㈡埛绔暟鎹苟鏄剧ずiRecvLen = recv(iSocketClient, RecvBuf, 511, 0);if(iRecvLen <= 0){printf("Recv error\n");close(iSocketClient);return -1;}else{RecvBuf[iRecvLen] = '\0';printf("Get Msg from client %d: %s\r\n", iClientNum, RecvBuf);}}}}}close(iSocketServer);return 0;
}

3.1.2 Client 程序

#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>#define SERVER_PORT 1234/* socket* connect * send/recv*/
int main( int argc, char **argv)
{int iSocketClient;int iRet;struct sockaddr_in tSocketServerAddr; unsigned char SendBuf[512];int iSendLen;if(argc != 2){printf("Usage:\n");printf("%s <server_ip>:\n",argv[0]);return -1;}iSocketClient = socket(AF_INET, SOCK_STREAM, 0);if(-1 == iSocketClient){printf("socket error!\r\n");return -1;}tSocketServerAddr.sin_family = AF_INET;tSocketServerAddr.sin_port = htons(SERVER_PORT);if(0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr)){printf("invailed server ip!\r\n");return -1;}memset(tSocketServerAddr.sin_zero, 0, 8);iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr,sizeof(struct sockaddr));if(-1 == iRet){printf("connect error!\r\n");return -1;}while(1){if(fgets(SendBuf, 511, stdin)){iSendLen = send(iSocketClient, SendBuf, strlen(SendBuf), 0);if(iSendLen <= 0){printf("Recv error\n");close(iSocketClient);return -1;}}}
}

3.1.3 测试结果

1.client 1 连接server 发送数据
在这里插入图片描述
2.Client2 连接server发送数据在这里插入图片描述
3.server 接收数据
在这里插入图片描述
4.当关闭一个Client后,server没有僵尸进程
在这里插入图片描述

3.2 UDP 测试

3.2.1 udp server

#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>#define SERVER_PORT 1234
#define BACKLOG		10/* socket* bind* sendto /recvfrom*/
int main( int argc, char **argv)
{int iSocketServer;int iSocketClient;int iRet;struct sockaddr_in tSocketServerAddr;struct sockaddr_in tSocketClientAddr;int iAddrLen;int iRecvLen;unsigned char RecvBuf[512];signal(SIGCHLD, SIG_IGN); iSocketServer = socket(AF_INET, SOCK_DGRAM, 0);if(-1 == iSocketServer){printf("socket error!\r\n");return -1;}tSocketServerAddr.sin_family = AF_INET;tSocketServerAddr.sin_port = htons(SERVER_PORT);tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;memset(tSocketServerAddr.sin_zero, 0, 8);iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr,sizeof(struct sockaddr));if(-1 == iRet){printf("bind error!\r\n");return -1;}while(1){iAddrLen = sizeof(struct sockaddr);iRecvLen = recvfrom(iSocketServer, RecvBuf, 511, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);if(iRecvLen > 0){RecvBuf[iRecvLen] = '\0';printf("Get Msg from client %s: %s\r\n", inet_ntoa(tSocketClientAddr.sin_addr), RecvBuf);}}close(iSocketServer);return 0;
}

3.2.2 udp client

#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>#define SERVER_PORT 1234/* socket* sendto/recvfrom**/
int main( int argc, char **argv)
{int iSocketClient;int iRet;struct sockaddr_in tSocketServerAddr; unsigned char SendBuf[512];int iSendLen;int iAddrLen;if(argc != 2){printf("Usage:\n");printf("%s <server_ip>:\n",argv[0]);return -1;}iSocketClient = socket(AF_INET, SOCK_DGRAM, 0);if(-1 == iSocketClient){printf("socket error!\r\n");return -1;}tSocketServerAddr.sin_family = AF_INET;tSocketServerAddr.sin_port = htons(SERVER_PORT);if(0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr)){printf("invailed server ip!\r\n");return -1;}memset(tSocketServerAddr.sin_zero, 0, 8);while(1){if(fgets(SendBuf, 511, stdin)){iAddrLen = sizeof(struct sockaddr);iSendLen = sendto(iSocketClient, SendBuf, strlen(SendBuf), 0,(const struct sockaddr *)&tSocketServerAddr, iAddrLen);if(iSendLen <= 0){printf("Recv error\n");close(iSocketClient);return -1;}}}
}

3.2.3 测试结果

1.udp client 1 发送数据
在这里插入图片描述
2.udp client2 发送数据
在这里插入图片描述
3.udp server 接收数据
在这里插入图片描述


To Be Continue …

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络的坚实与灵活:工业与常规以太网交换机的差异解析

&#x1f310;&#x1f310;在当今互联网和物联网迅速发展的背景下&#xff0c;以太网交换机作为网络通信的核心设备&#xff0c;其性能和稳定性对于整个网络系统的运行至关重要。工业以太网交换机和常规以太网交换机乍一看似乎很相似&#xff0c;但两者之间存在着一些关键区别…

深入探索:Zookeeper+消息队列(kafka)集群

目录 前言 一、Zookeeper概述 1、Zookeeper概念 2、Zookeeper 特点 3、Zookeeper工作机制 4、Zookeeper 选举机制 4.1 第一次启动选举机制 4.2 非第一次启动选举机制 5、Zookeeper 数据结构 6、Zookeeper 应用场景 二、部署 Zookeeper 集群 1、环境部署 2、安装 z…

OpenHarmony音频和音乐编码格式—vorbis

简介 一种通用音频和音乐编码格式。 Vorbis编解码器规范属于公共领域。所有技术细节都已发布并记录&#xff0c;任何软件实体都可以充分利用该格式&#xff0c;而无需支付许可费、版税或专利问题。 下载安装 直接在OpenHarmony-SIG仓中搜索vorbis并下载。 使用说明 以OpenHa…

测试JAVA 测开

测试、java测开 1、测试用例要素&#xff08;4个重要要素&#xff09;2、测试用例的好处3、测试用例的设计方法3.1 基于需求设计测试用例3.2 等价类3.3 边界值3.4 判定表 1、测试用例要素&#xff08;4个重要要素&#xff09; 测试环境操作步骤测试数据预期结果 2、测试用例的…

企业数字化与数智化的区别是什么?

一、引言 随着信息技术的迅猛发展和应用普及&#xff0c;企业面临着数字化与数智化两大转型趋势。数字化主要关注数据的收集、整合和流程优化&#xff0c;而数智化则在此基础上进一步引入智能技术&#xff0c;实现业务的自动化、智能化和决策的科学化。探讨企业数字化与数智化…

初级C语言:6 结构体

6.1 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 内置类型&#xff1a;char&#xff1b;short&#xff1b;int&#xff1b;long&#xff1b;long long&#xff1b;float&#xff1b;double 复杂对象的描述就会使…

通过拖拽动态调整div的大小

最近遇到一个需求&#xff0c;页面展示两块内容&#xff0c;需要通过拖拽可以动态改变大小&#xff0c;如下图&#xff1a; 实现思路&#xff1a;其实就是改变div样式的width&#xff0c;本质上就是Dom操作。 完整代码&#xff1a;&#xff08;基于vue2项目实践&#xff09; …

第 7 章 导航实现(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 准备工作 请先安装相关的ROS功能包&#xff1a; 安装 gmapping 包(用于构建地图)&#xff1a; sudo apt inst…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求&#xff0c;感觉挺有意思就写了这篇文章&#xff0c;感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道&#xff0c;这个页面本身没有新闻信息&#xff0c;是…

比特币叙事大转向

作者&#xff1a;David Lawant 编译&#xff1a;秦晋 要理比特币解减半动态&#xff0c;最关键的图表是下面这张&#xff0c;而不是价格图表。它显示了自 2012 年以来&#xff0c;矿业总收入与比特币现货交易量的比例&#xff0c;并标注了三个减半日期。 虽然矿工仍然是比特币生…

OpenHarmony图像解码库—stb-image [GN编译]

简介 stb_image主要是C/C实现的图像解码库。 下载安装 直接在OpenHarmony-SIG仓中搜索stb-image并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/stb-image 修改添加依赖的编译脚本&#xff0c;路径&#xff1a;/devel…

编程入门(五)【Visual Studio Code安装与C/C++语言运行】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言VScode安装与环境配置编写第一个C语言程序总结 前言 经过了前面对计算机…

mars3d实现禁止地图移动,禁止地图左右平移,但是鼠标可以移动的效果。

new mars3d.layer.GeoJsonLayer({渲染后实现鼠标左键按住不释放拖动时&#xff0c;地图不跟着拖动效果 当前问题&#xff1a; 1.在map初始化&#xff0c;或者是加载效果的时候&#xff0c;整个地球的场景都是一样的。 如果鼠标左键按住不释放&#xff0c;在屏幕上拖动的时候…

还在 MySQL 中使用枚举?小心有坑~

为什么使用枚举 限定值的取值范围&#xff0c;比如性别&#xff08;男&#xff0c;女&#xff0c;未知&#xff09;等。 枚举类型使用陷阱 1.超级不推荐在mysql中设置某一字段类型为enum&#xff0c;但是存的值为数字&#xff0c;比如‘0’&#xff0c;‘1’&#xff0c;‘2…

软考135-上午题-【软件工程】-软件配置管理

备注&#xff1a; 该部分考题内容在教材中找不到。直接背题目 一、配置数据库 配置数据库可以分为以下三类&#xff1a; (1) 开发库 专供开发人员使用&#xff0c;其中的信息可能做频繁修改&#xff0c;对其控制相当宽松 (2) 受控库 在生存期某一阶段工作结束时发布的阶段产…

【算法】深度优先遍历(DFS)算法详解与实现

文章目录 1.算法原理2. 常见的深度优先遍历方式3. 代码实现总结 深度优先遍历&#xff08;DFS&#xff09;是一种常用的树或图的遍历算法&#xff0c;它通过尽可能深地搜索树或图的分支&#xff0c;直到路径上的所有节点都被访问完毕&#xff0c;然后再回溯到上一层&#xff0c…

什么是云渲染?云渲染平台怎么使用?云渲染怎么收费?

什么是云渲染&#xff1f; 云渲染是一种利用云计算技术提供的云端服务&#xff0c;用户可以将本地任务递交到远程服务器上&#xff0c;由远程计算集群协调和完成渲染&#xff0c;并将结果返回本地&#xff0c;最后用户可以在本地下载渲染结果。 而实时云渲染则是云渲染的一种…

python入门之简洁安装VS保姆版安装(含虚拟环境)

11、保姆版安装 Anoconda安装&#xff08;python的一个发行版本&#xff09; 优点&#xff1a;集成了许多关于python科学计算的第三方库&#xff0c;保姆级别 下载&#xff1a;www.anaconda.com/download/ 版本默认64位&#xff0c;py37 √&#xff1a;add anaconda to my…

OCP Java17 SE Developers 复习题14

答案 C. Since the question asks about putting data into a structured object, the best class would be one that deserializes the data. Therefore, ObjectInputStream is the best choice, which is option C. ObjectWriter, BufferedStream, and ObjectReader are no…

可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?

在当今的信息化时代&#xff0c;数据已经成为了现代决策的核心。无论是企业战略规划、运营管理&#xff0c;还是个人生活决策&#xff0c;数据都扮演着至关重要的角色。随着数据分析技术和工具的不断进步&#xff0c;数据在决策中的作用将变得更加突出&#xff0c;对组织和个人…