网络编程;套接字;TCP通讯;UDP通讯;0909

思维导图

TCP服务器端和客户端通讯

服务器端 代码

#include<myhead.h>
#define SER_IP "192.168.109.12"//我的虚拟机的ip
#define SER_PORT 8888
int main()
{//1.创建一个用于连接的套接字文件描述符int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}printf("sfd = %d\n",sfd);//2.给套接字绑定ip地址和的端口号//2.1准备地址信息结构体struct sockaddr_in sin;//通信域地址族sin.sin_family = AF_INET;//服务器端口号sin.sin_port = htons(SER_PORT);//2字节 主机字节序 转化为 网络字节序//服务器ip地址sin.sin_addr.s_addr = inet_addr(SER_IP);//ip地址 点分十进制 转化为 网络字节序//2.2执行绑定工作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.阻塞 等客户端的连接//4.1 定义地址信息结构体,用于客户端地址信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);//接收地址长度int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd==-1){perror("accept error");return -1;}printf("[%s:%d]-连接成功newfd = %d\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),newfd);//5.实现数据的收发char buf[128]="";while(1){//清空bufbzero(buf,sizeof(buf));//从套接字读取消息int res=read(newfd,buf,sizeof(buf));if(res==0){printf("客户端下线\n");close(newfd);//关闭通信套接字break;}printf("[%s:%d] : %s\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),buf);//给消息 加个:D还回去strcat(buf,":D");write(newfd,buf,strlen(buf));printf("发送成功\n");}//6.关闭套接字close(sfd);return 0;
}

客户端 代码

#include<myhead.h>
#define SER_IP "192.168.109.12"    //服务器ip地址
#define SER_PORT 8888               //服务器端口号
#define CLI_IP "192.168.109.12"     //客户端ip地址
#define CLI_PORT 7777               //客户端端口号int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、给客户端套接字绑定ip地址和端口号//2.1 填充地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_addr.s_addr = inet_addr(CLI_IP);cin.sin_port = htons(CLI_PORT);//2.2 绑定if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin))==-1){perror("bind error");return -1;}//3、连接服务器//3.1 组装对端地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;    //通信域sin.sin_addr.s_addr = inet_addr(SER_IP);   //要连接的服务器ipsin.sin_port = htons(SER_PORT);     //服务器的端口号//3.2 连接操作if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("connect error");return -1;}//4、数据通信char buf[128] = "";while(1){//从终端输入要发送的消息fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//判断输入内容if(strcmp(buf, "quit")==0){break;}//将消息发送给服务器write(cfd, buf, strlen(buf));printf("发送成功\n");//接受服务器发来的消息bzero(buf, sizeof(buf));int res = read(cfd, buf, sizeof(buf));if(res == 0){printf("服务器已经下线\n");break;}printf("收到服务器消息:%s\n", buf);}//5、关闭套接字close(cfd);return 0;
}

运行

UDP服务器和客户端通讯

服务器代码

#include<myhead.h>
#define SER_IP "192.168.109.12"
#define SER_PORT 8888/*****************主程序*****************/
int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、绑定ip地址和端口号(必须)//2.1 封装结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(SER_IP);sin.sin_port = htons(SER_PORT);//2.2 绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("bind error");return -1;}//3、数据收发char buf[128] = "";      //用于接受对端消息//定义一个地址信息结构体的变量,用于接收对端地址struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);   //接受地址长度while(1){//清空容器bzero(buf, sizeof(buf));//从套接字文件描述符中读取消息recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);//给消息加个笑脸还回去strcat(buf, ":D");//发送消息sendto(sfd, buf, strlen(buf), 0, (struct sockaddr*)&cin, sizeof(cin));printf("发送成功\n");}//4、关闭套接字close(sfd);return 0;
}                            

客户端代码

#include<myhead.h>#define SER_IP "192.168.109.12"
#define SER_PORT 8888/******************主程序******************/
int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、绑定ip和端口号(可选)//3、数据收发char buf[128] = "";    //数据容器struct sockaddr_in sin;     //目标地址sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);socklen_t addrlen = sizeof(sin);while(1){//清空容器bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);   //从终端获取数据buf[strlen(buf)-1] = 0;if(strcmp(buf,"quit")==0){break;}//将数据发送给服务器sendto(cfd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("发送成功\n");//接收服务器发来的消息bzero(buf, sizeof(buf));//recvfrom(cfd, buf, sizeof(buf), 0, (struct socket*)&sin, &addrlen);//recvfrom(cfd, buf, sizeof(buf), 0, NULL,NULL);read(cfd, buf, sizeof(buf));printf("收到服务器消息为:%s\n", buf);}//4、关闭套接字close(cfd);return 0;
}

运行情况

牛客

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

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

相关文章

贪心算法应用:柔性制造系统(FMS)刀具分配问题详解

Java中的贪心算法应用&#xff1a;柔性制造系统(FMS)刀具分配问题详解 1. 问题背景与定义 柔性制造系统(Flexible Manufacturing System, FMS)是现代智能制造中的关键组成部分&#xff0c;它能够灵活地适应不同产品的生产需求。在FMS中&#xff0c;刀具分配是一个核心优化问题&…

不止是DELETE:MySQL多表关联删除的JOIN语法实战详解

MySQL 的 ​​DELETE​​ 语句用于从数据库表中删除记录。这是一项非常强大且危险的操作&#xff0c;因为一旦执行&#xff0c;数据通常无法恢复。理解其语法和安全实践至关重要。以下是 MySQL 删除语句的详细指南。一、 核心语法&#xff1a;DELETE​​DELETE​​ 语句用于删除…

ubuntu 系統使用過程中黑屏問題分析

背景&#xff1a; 工欲善其事&#xff0c;必先利其器。作为程序员&#xff0c;想要得到更好的发展&#xff0c;遇到问题直接baidu, google 虽然可以得到一些参考或者答案&#xff0c;但是也会降低自己的思考能力&#xff0c;本文以ubuntu 使用过程中黑屏这一问题为背景&#x…

Redis(45)哨兵模式与集群模式有何区别?

Redis 提供了两种高可用性解决方案&#xff1a;哨兵模式和集群模式。它们各自有不同的特点和适用场景。以下是详细的对比和结合代码的示例&#xff1a; 哨兵模式&#xff08;Sentinel&#xff09; 特点高可用性&#xff1a; Sentinel 通过监控、通知、故障转移等功能&#xff0…

微信小程序如何进行分包处理?

目录 分包是什么&#xff1f; 为什么要分包&#xff1f; 分包前后结构对比 具体操作步骤 第 1 步&#xff1a;规划分包结构 第 2 步&#xff1a;修改 app.json 进行配置 第 3 步&#xff1a;创建分包目录并移动文件 第 4 步&#xff1a;处理组件和工具函数的引用 第 5…

Go语言极速入门与精要指南从零到精通的系统化学习路径

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

git 切换仓库后清理分支缓存

我明白了&#xff0c;从您的截图可以看到远程仓库中有 feature/v1.4_20250903 分支&#xff0c;但本地 git branch -r 看不到&#xff0c;这是因为之前更换过仓库地址后需要重新获取远程仓库的所有信息。让我们执行以下步骤来解决这个问题&#xff1a; 首先执行 git fetch --al…

考研倒计时101天---路由选择协议

路由选择协议&#xff1a;RIP 与 OSPFRIP 协议&#xff08;基于距离向量算法&#xff09;RIP&#xff08;Routing Information Protocol&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;采用距离向量算法进行路由选择。其主要特点如下&#xff1a;工作机…

「类 vs 实例」对比 ,「类 - 原型 - 实例」的关系

坚持的本身就是意义 目录直观类比类 (Class) vs 实例 (Instance)对比表示例代码类 - 原型 - 实例关系图解释&#xff1a;类 (class Person)原型 (Person.prototype)实例 (new Person(...))总结&#xff1a;直观类比 类&#xff08;Class&#xff09; 图纸 / 模板实例&#xf…

第一课、Cocos Creator 3.8 安装与配置

介绍说明 本文主要介绍在windows系统中&#xff0c;安装开发Cocos使用的软件工具&#xff0c;主要包含&#xff1a;安装CocosDashboard控制面板、CocosCreator3.8编辑器和脚本编辑器 VS Code 。 一、Cocos Dashboard 的安装 说明&#xff1a;Cocos Dashboard 主要作用是能够同…

从航空FACE的一个落地方案漫谈汽车HPC软件架构的思维转变(2/3)FACE的“段”同Autosar的“层”概念区别探索

文章目录PART THREE&#xff1a;段和层的概念比较一、“段”更强调“功能闭环责任归属”&#xff0c;而非“单纯的层级堆叠”二、“段”规避“层”的“刚性依赖陷阱”&#xff0c;适配航空系统的“灵活组合需求”三、“段”贴合航空工业的“工程化语言习惯”&#xff0c;降低跨…

金融量化指标--6InformationRatio信息比率

InformationRatio信息比率计算公式添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;一、信息比率&#xff08;IR&#xff09;是什么&#xff1f;核心概念&#xff1a;信息比率衡量的是投资组合经理相对于某个基准指数&#xff08;Benchmark&#xff09;&…

Java全栈开发面试实录:从基础到微服务的实战经验分享

Java全栈开发面试实录&#xff1a;从基础到微服务的实战经验分享 一、初识面试场景 我叫李明&#xff0c;28岁&#xff0c;毕业于复旦大学计算机科学与技术专业&#xff0c;硕士学历。在互联网行业已经有5年的工作经验&#xff0c;先后在两家中型互联网公司担任Java全栈开发工程…

【51单片机】【protues仿真】基于51单片机公交报站系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 主要功能如下&#xff1a; 1、LCD12864显示时间、日期、公交车车站、温度等 2、按键设置时间&#xff0c;显示公交车信息 3、串口播报相应站点信息 4、按键控制上行、下行、手动播…

第1节-PostgreSQL入门-从表中查询数据

摘要&#xff1a;在本教程中,你将学习如何使用 PostgreSQL 的 SELECT 语句从表中检索数据。 SELECT 语句 要从表中查询数据,需使用 PostgreSQL 的 SELECT 语句。 以下是 SELECT 语句的基本语法: SELECT column1, column2, ... FROM table_name;在这种语法中: 首先,在 SELECT 关…

【C++进阶】---- map和set的使用

1.序列式容器和关联式容器 前⾯我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧密的关联关系…

430章:Python Web爬虫入门:使用Requests和BeautifulSoup

在软件交付日益高频、用户需求快速迭代的今天&#xff0c;版本发布流程的规范性直接决定了团队的交付效率、产品质量和用户满意度。然而&#xff0c;许多团队仍面临以下痛点&#xff1a;发布混乱&#xff1a;分支管理随意&#xff0c;代码冲突频发&#xff1b;质量失控&#xf…

代码随想录第七天|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 18.四数之和

本文所有题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html 454.四数相加II 有四个数组&#xff0c;如果要遍历则时间复杂度太大 可以选择分组&#xff0c;a和b一组&#xff0c;c和d一组 这样就可以等同于…

Vue3源码reactivity响应式篇之computed计算属性

概述 vue3中&#xff0c;computed函数用于表示计算属性&#xff0c;有惰性求值、响应式追踪依赖的特点。本文将介绍computed的实现原理以及其机制细节。 源码解析 computed计算属性和computed方法、ComputedRefImpl类以及refreshComputed方法有关。 computed方法 computed暴露给…

[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行

[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行Keil5-验证“Reset and Run”功能是否生效参考文章Keil5-验证“Reset and Run”功能是否生效 参考文章 Keil5烧录后STM32不自动运行&#xff1f;必须复位才能启动的终极解决方案