网络编程:基于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 的模板,目前需要…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
