网络编程:基于TCP和UDP的服务器、客户端
1.基于TCP通信服务器
程序代码:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于监听的套接字7 int sfd=-1;8 sfd=socket(AF_INET,SOCK_STREAM,0);9 //参数1:IPv4的通信10 //参数2:使用TCP通信类型11 //参数3:参数2以确定通信类型,012 if(sfd==-1)13 {14 perror("socket error");15 return -1;16 }17 printf("sfd=%d\n",sfd);//3 返回文件描述符,最小分配原则18 //2.绑定IP地址和端口号19 //2.1填充地址信息结构体20 struct sockaddr_in sin;21 sin.sin_family=AF_INET;//地址族22 sin.sin_port=htons(SER_PORT);//要2字节无符号整数端口号(网络字节序)23 //将主机字节序转换为网络字节序24 sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址(sin的sin_addr的s_addr)25 //要IP地址的网络字节序,将点分十进制数据转换为4字节无符号整数的网络字节序26 //2.2绑定27 if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)28 //要绑定的套接字文件描述符,通用地址信号结构体,结构体大小29 {30 perror("bind error");31 return -1;32 }33 printf("bind success\n");34 //3.启动监听,允许客户端连接35 if(listen(sfd,128)==-1)36 {37 perror("listen error");38 return -1;39 }40 printf("listen success\n");41 //4.客户端发来连接请求后,创建新的用于通信的套接字42 //不想接收客户端地址信息结构体,则无需传参2,参343 //想要获取客户端地址信息结构体,要传入相关参数44 struct sockaddr_in cin;//用于接收客户端地址信息结构体45 socklen_t socklen=sizeof(cin);//用于接收客户端地址信息大小46 int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);47 //阻塞等待客户端请求,客户端发来连接请求后,创建新的套接字,返回套接字文件描述符48 //参数1:服务器套接字文件描述符49 //参数2:通用地址信号结构体,接收最新连接的客户端地址信息50 //参数3:客户端套接字大小,地址传递51 if(newfd==-1)//成功返回套接字文件描述符,失败-152 {53 perror("accept error");54 return -1;55 }56 printf("newfd=%d您有新的客户已经上线\n",newfd);57 printf("客户端IP:%s,端口号:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));58 //将IP地址的网络字节序(4字节无符号整数)转换为点分十进制字符串(IP地址的网络字节序)59 //将端口的网络字节序(2字节无符号整数)转换为主机字节序(端口的网络字节序)60 //5.通信套接字与客户端进行数据收发61 char rbuf[128]="";62 while(1)63 {64 //清空容器65 bzero(rbuf,sizeof(rbuf));66 //从套接字中读取数据67 int res=read(newfd,rbuf,sizeof(rbuf));68 if(res==0)69 {70 printf("客户端已下线\n");71 break;72 }73 printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);74 //将收到的消息加上其他字符回过去75 strcat(rbuf,"*_*");76 write(newfd,rbuf,strlen(rbuf));77 }78 //6.关闭套接字79 close(newfd);80 close(sfd);81 return 0;82 }
运行结果:

2. 基于TCP通信客户端
程序代码:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于通信的套接字文件描述符7 int cfd=socket(AF_INET,SOCK_STREAM,0);8 //使用IPv4通信,使用TCP通信类型,已确定通信类型09 if(cfd==-1)10 {11 perror("socket error");12 return -1;13 }14 printf("cfd=%d\n",cfd);//返回文件描述符,最小分配315 //2.绑定(不写系统默认绑定)16 //3.连接服务器17 //3.1填充要连接的服务器地址信息结构体18 struct sockaddr_in sin;19 sin.sin_family=AF_INET;//地址族20 sin.sin_port=htons(SER_PORT);//端口号21 sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址22 //3.2连接服务器23 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)24 {25 perror("connect error");26 return -1;27 }28 printf("connect success\n");29 //4数据收发30 char wbuf[128]="";31 while(1)32 {33 //清空数据34 bzero(wbuf,sizeof(wbuf));35 printf("请输入>>>");36 fgets(wbuf,sizeof(wbuf),stdin);//终端输入37 wbuf[strlen(wbuf)-1]=0;38 //将数据发送给服务器39 send(cfd,wbuf,strlen(wbuf),0);40 printf("发送成功\n");41 if(strcmp(wbuf,"quit")==0)42 break;43 //接收服务器发来的消息44 //清空数据45 bzero(wbuf,sizeof(wbuf));46 recv(cfd,wbuf,sizeof(wbuf),0);47 printf("收到消息为;%s\n",wbuf);48 }49 //5.关闭套接字50 close(cfd);51 return 0;52 }
~
运行结果:

3.基于UDP通信服务器
程序代码:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于通信的套接字7 int sfd=socket(AF_INET,SOCK_DGRAM,0);8 if(sfd==-1)9 {10 perror("socket error");11 return -1;12 }13 printf("sfd=%d\n",sfd);14 //2.绑定IP地址和端口号15 //2.1填充地址信息结构体16 struct sockaddr_in sin;17 sin.sin_family=AF_INET;//地址族18 sin.sin_port=htons(SER_PORT);//端口号19 sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址20 //2.2绑定21 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)22 {23 perror("bind error");24 return -1;25 }26 printf("bind success\n");27 //3.收发数据28 char rbuf[128]="";29 //定义容器接收对端地址信息结构体30 struct sockaddr_in cin;31 socklen_t socklen=sizeof(cin);32 while(1)33 {34 //清空数组35 bzero(rbuf,sizeof(rbuf));36 //接收数据37 recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen);38 printf("收到消息为:%s\n",rbuf);39 //将消息加*_*回过去40 strcat(rbuf,"*_*");41 if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cin,socklen)=42 {43 perror("sendto error");44 return -1;45 }46 }47 //4.关闭套接字48 close(sfd);49 return 0;50 }
运行结果:

4.基于UDP的客户端
程序代码:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//IP地址3 #define SER_PORT 8888//服务器端口4 int main(int argc, const char *argv[])5 {6 //1.创建用于通信的套接字7 int cfd=socket(AF_INET,SOCK_DGRAM,0);8 if(cfd==-1)9 {10 perror("socket error");11 return -1;12 }13 printf("cfd=%d\n",cfd);14 //2.绑定IP地址和端口号15 //非必要16 //3.收发数据17 char wbuf[128]="";18 //定义容器,记录服务器的地址信息结构体19 struct sockaddr_in sin;20 sin.sin_family=AF_INET;21 sin.sin_port=htons(SER_PORT);22 sin.sin_addr.s_addr=inet_addr(SER_IP);23 while(1)24 {25 //清空数组26 bzero(wbuf,sizeof(wbuf));27 //从终端获取数据28 printf("请输入>>>");29 fgets(wbuf,sizeof(wbuf),stdin);30 wbuf[strlen(wbuf)-1]=0;31 //将数据发送给服务器32 sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sin,sizeof(sin));33 printf("发送成功\n");34 //接收服务器回复的消息35 bzero(wbuf,sizeof(wbuf));36 recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);37 printf("收到消息:%s\n",wbuf);38 }39 //关闭套接字40 close(cfd);41 return 0;42 }
运行结果:
流程图:

面试:

相关文章:
网络编程:基于TCP和UDP的服务器、客户端
1.基于TCP通信服务器 程序代码: 1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于监听的套接字7 int sfd-1;8 sf…...
kubectl 命令行管理K8S(上)
目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 应用发布策略 金丝雀发布 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源…...
Redis 之四:Redis 事务和乐观锁
事务特点 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。不具备原子性。 在事务执…...
C# WPF编程-创建项目
1.创建新项目 选择“WPF应用程序”》“下一步” 设置项目 设置项目名称,保存位置等参数>下一步 3.选择框架 4.项目创建成功 5.运行项目...
密码学及其应用(应用篇15)——0/1背包问题
1 问题背景 背包问题是一个经典的优化问题,在计算机科学和运筹学中有着广泛的应用。具体到你提到的这个问题,它是背包问题中的一个特例,通常被称为0/1背包问题。这里,我们有一系列的正整数 ,以及一个正整数,…...
基于springboot+vue的实验室管理系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
华为OD技术面试案例5-2024年
背景 985本计算机专业,目标院校。 1.15 投递 在某BOSS上投递的简历,HR人很nice,非常负责任。 1.19 收到机试通知 第一题是一个哈夫曼编码,第三题是一个动态规划,机试整体难度不算高,刷leetcode hot100…...
【QT+QGIS跨平台编译】之五十五:【QGIS_CORE跨平台编译】—【qgsmeshcalcparser.cpp生成】
文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…...
Unity(第二十部)效果 粒子、线条和拖尾
1、粒子系统 粒子系统介绍 Unity 粒子系统是 Unity 引擎中用于创建和控制粒子效果的工具。它可以模拟各种自然现象,如火焰、烟雾、雨滴等,也可以用于创建特效,如魔法光芒、爆炸效果等。 粒子系统组成 在 Unity 中,粒子系统由发射…...
全量知识系统问题及SmartChat给出的答复 之6 三套工具之1
Q15. 提出想法和问题 前面说过,DDD在我要设计的全量知识系统中位于中间层,是专门用来解决“知识汤”问题的。 解决的思路就是以将为在特定领域中的公司经营提供一个责任-权限平面为目的,帮助他们调整商业模式以及组建恰当的组织,…...
[RoarCTF 2019]Easy Calc
这题考查的是: 字符串解析特性目录读取文件内容读取 字符串解析特性详解:PHP字符串解析特性 ($GET/$POST参数绕过)(含例题 buuctf easycalc)_参数解析 绕过-CSDN博客 ascii码查询表:ASCII 表 | 菜鸟工具 …...
完美解决 git 报错fatal: Not a git repository (or any of the parent directories): .git
问题描述 错误提示是找不到.git文件,无法执行git指令,意思是 当前你要提交的文件夹中没有.git这个文件 解决方案 执行如下命令: git init...
electron无法设置自己的图标?渲染进程require报错?
electron无法设置自己的图标? 极有可能是图标太大,或者宽高不同 我推荐的网址icon转换 选着20x20一般就可以 渲染进程无法使用require?一直报错? webPreferences: {nodeIntegration: true, enableRemoteModule: true, contextIsolation: …...
vscode连接服务器与FileZilla上传到服务器
https://www.cnblogs.com/qiuhlee/p/17729647.html(这个是vscode连接服务器) 主机:就是服务器的主机号 使用者名称:比如ALmax的用户名 密码:比如ALmax的密码...
练习 1 Web EasySQL极客大挑战
CTF Week 1 EasySQL极客大挑战 BUUCTF 典中典复习 Web SQL 先尝试输入,找一找交互页面 check.php 尝试万能语句 a’ or true SQL注入:#和–的作用 get传参只能是url编码,注意修改编码,输入的字符串要改成url格式。 POST请求和…...
matlab生成模拟的通信信号
matlab中rand函数生成均匀随机分布的随机数,randn生成正态分布的随机数; matlab来模拟一个通信信号; 通信信号通过信道时,研究时认为它会被叠加上服从正态分布的噪声; 先生成随机信号模拟要传输的信号,s…...
Altair® SimLab® 以流程为导向的多学科仿真环境,可连接CAD 的多物理场工作流程
Altair SimLab 以流程为导向的多学科仿真环境,可连接CAD 的多物理场工作流程 SimLab 是一种以流程为导向的多学科仿真环境,能够精确分析复杂装配体的性能表现。包括结构、热和流体动力学在内的多物理场可以通过高度自动化的建模任务轻松设置,有助于大幅…...
Python爬虫-爬取B站番剧封面
本文是本人最近学习Python爬虫所做的小练习。如有侵权,请联系删除。 页面获取url 代码 import requests import os import re# 创建文件夹 path os.getcwd() /images if not os.path.exists(path):os.mkdir(path)# 当前页数 page 1 # 总页数 total_page 2# 自动…...
AI时代的产品文案秘籍:如何用AI提升效率
人工智能写作工具:解放双手,创作不停歇 在当前人工智能技术飞速发展的背景下,越来越多的个体已经开始利用这一AI写作工具,以显著提高自己的工作效率。这不仅标志着人工智能服务于人类的宏伟时代的到来,更是人人可用的创…...
前端架构: 脚手架通用框架封装之入口文件开发(教程一)
脚手架入口文件开发 创建脚手架项目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安装 lerna, $ npm i -g lerna 基于 lerna 完成项目初始化 $ lerna init 基于 lerna 创建脚手架 cli $ lerna create cli一路回车 好现在生成了一个 cli 的模板,目前需要…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
