当前位置: 首页 > 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;目前需要…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...