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

网络编程:基于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通信服务器 程序代码&#xff1a; 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 事务可以一次执行多个命令&#xff0c; 并且带有以下三个重要的保证&#xff1a; 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行&#xff0c;事务中任意命令执行失败&#xff0c;其余的命令依然被执行。不具备原子性。 在事务执…...

C# WPF编程-创建项目

1.创建新项目 选择“WPF应用程序”》“下一步” 设置项目 设置项目名称&#xff0c;保存位置等参数>下一步 3.选择框架 4.项目创建成功 5.运行项目...

密码学及其应用(应用篇15)——0/1背包问题

1 问题背景 背包问题是一个经典的优化问题&#xff0c;在计算机科学和运筹学中有着广泛的应用。具体到你提到的这个问题&#xff0c;它是背包问题中的一个特例&#xff0c;通常被称为0/1背包问题。这里&#xff0c;我们有一系列的正整数 &#xff0c;以及一个正整数&#xff0c…...

基于springboot+vue的实验室管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

华为OD技术面试案例5-2024年

背景 985本计算机专业&#xff0c;目标院校。 1.15 投递 在某BOSS上投递的简历&#xff0c;HR人很nice&#xff0c;非常负责任。 1.19 收到机试通知 第一题是一个哈夫曼编码&#xff0c;第三题是一个动态规划&#xff0c;机试整体难度不算高&#xff0c;刷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 引擎中用于创建和控制粒子效果的工具。它可以模拟各种自然现象&#xff0c;如火焰、烟雾、雨滴等&#xff0c;也可以用于创建特效&#xff0c;如魔法光芒、爆炸效果等。 粒子系统组成 在 Unity 中&#xff0c;粒子系统由发射…...

全量知识系统问题及SmartChat给出的答复 之6 三套工具之1

Q15. 提出想法和问题 前面说过&#xff0c;DDD在我要设计的全量知识系统中位于中间层&#xff0c;是专门用来解决“知识汤”问题的。 解决的思路就是以将为在特定领域中的公司经营提供一个责任-权限平面为目的&#xff0c;帮助他们调整商业模式以及组建恰当的组织&#xff0c…...

[RoarCTF 2019]Easy Calc

这题考查的是: 字符串解析特性目录读取文件内容读取 字符串解析特性详解&#xff1a;PHP字符串解析特性 &#xff08;$GET/$POST参数绕过&#xff09;&#xff08;含例题 buuctf easycalc&#xff09;_参数解析 绕过-CSDN博客 ascii码查询表&#xff1a;ASCII 表 | 菜鸟工具 …...

完美解决 git 报错fatal: Not a git repository (or any of the parent directories): .git

问题描述 错误提示是找不到.git文件&#xff0c;无法执行git指令&#xff0c;意思是 当前你要提交的文件夹中没有.git这个文件 解决方案 执行如下命令&#xff1a; git init...

electron无法设置自己的图标?渲染进程require报错?

electron无法设置自己的图标&#xff1f; 极有可能是图标太大&#xff0c;或者宽高不同 我推荐的网址icon转换 选着20x20一般就可以 渲染进程无法使用require?一直报错&#xff1f; webPreferences: {nodeIntegration: true, enableRemoteModule: true, contextIsolation: …...

vscode连接服务器与FileZilla上传到服务器

https://www.cnblogs.com/qiuhlee/p/17729647.html&#xff08;这个是vscode连接服务器&#xff09; 主机&#xff1a;就是服务器的主机号 使用者名称&#xff1a;比如ALmax的用户名 密码&#xff1a;比如ALmax的密码...

练习 1 Web EasySQL极客大挑战

CTF Week 1 EasySQL极客大挑战 BUUCTF 典中典复习 Web SQL 先尝试输入&#xff0c;找一找交互页面 check.php 尝试万能语句 a’ or true SQL注入&#xff1a;#和–的作用 get传参只能是url编码&#xff0c;注意修改编码&#xff0c;输入的字符串要改成url格式。 POST请求和…...

matlab生成模拟的通信信号

matlab中rand函数生成均匀随机分布的随机数&#xff0c;randn生成正态分布的随机数&#xff1b; matlab来模拟一个通信信号&#xff1b; 通信信号通过信道时&#xff0c;研究时认为它会被叠加上服从正态分布的噪声&#xff1b; 先生成随机信号模拟要传输的信号&#xff0c;s…...

Altair® SimLab® 以流程为导向的多学科仿真环境,可连接CAD 的多物理场工作流程

Altair SimLab 以流程为导向的多学科仿真环境,可连接CAD 的多物理场工作流程 SimLab 是一种以流程为导向的多学科仿真环境&#xff0c;能够精确分析复杂装配体的性能表现。包括结构、热和流体动力学在内的多物理场可以通过高度自动化的建模任务轻松设置&#xff0c;有助于大幅…...

Python爬虫-爬取B站番剧封面

本文是本人最近学习Python爬虫所做的小练习。如有侵权&#xff0c;请联系删除。 页面获取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提升效率

人工智能写作工具&#xff1a;解放双手&#xff0c;创作不停歇 在当前人工智能技术飞速发展的背景下&#xff0c;越来越多的个体已经开始利用这一AI写作工具&#xff0c;以显著提高自己的工作效率。这不仅标志着人工智能服务于人类的宏伟时代的到来&#xff0c;更是人人可用的创…...

前端架构: 脚手架通用框架封装之入口文件开发(教程一)

脚手架入口文件开发 创建脚手架项目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安装 lerna, $ npm i -g lerna 基于 lerna 完成项目初始化 $ lerna init 基于 lerna 创建脚手架 cli $ lerna create cli一路回车 好现在生成了一个 cli 的模板&#xff0c;目前需要…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块&#xff0c;提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中&#xff0c;这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构&#xff0c;与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...