2024/03/14(网络编程·day2)

一、思维导图

二、TCP通信

//服务器

#include<myhead.h>

#define SER_PORT 8888 	//服务器端口号
#define SER_IP "192.168.117.103" 	//服务器IP
int main(int argc, const char *argv[])
{
	//1、创建一个套接字
	int sfd = -1;
	sfd = socket(AF_INET,SOCK_STREAM,0);
	//参数1:表示创建的是网络通信的套接字
	//参数2:表示使用的是TCP通信协议
	//参数3:参数2指定了协议,参数3填0即可
	if(sfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("%d success sfd = %d\n",__LINE__,sfd);  //3

	//设置端口号快速重用
	int reuse = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("端口号快速重用成功\n");

	//2、绑定IP和端口号
	//2.1填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET; 	//地址族
	sin.sin_port = htons(SER_PORT); 	//端口号
	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("%d bind success\n",__LINE__);

	//3、将套接字设置成被监听状态
	if(listen(sfd,128) == -1)
	{
		perror("listen error");
		return -1;
	}

	//4、阻塞等待客户端的连接请求
	int newfd = -1;
	//定义结构体变量接受客户端地址信息结构体
	struct sockaddr_in cin;//接收客户端信息结构体
	socklen_t addrlen = sizeof(cin);//接收客户端结构体大小

	if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen)) == -1)
	{
		perror("accept error");
		return -1;
	}
	printf("[%s  %d]请求连接\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));

	//5、收发数据
	char rbuf[128] = "";//接收客户端发送的信息
	while(1)
	{
		//将容器清空
		bzero(rbuf,sizeof(rbuf));//memset(rbuf,0,sizeof(rbuf));

		//从套接字中读取数据
		int res = recv(newfd,rbuf,sizeof(rbuf)-1,0);
		if(res == 0)
		{
			printf("客户端已下线\n");
			break;
		}
		printf("[%s  %d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);

		//加个收到再回回去
		strcat(rbuf," <Got it>!");

		send(newfd,rbuf,strlen(rbuf),0);
		printf("回复成功\n");		 

	}
	//6、关闭服务器
		close(newfd);
		close(sfd);
	return 0;
}

//客户端

#include<myhead.h>
#define SER_PORT 8888
#define SER_IP "192.168.117.103"
#define CLI_PORT 9999
#define CLI_IP "192.168.117.103"

int main(int argc, const char *argv[])
{
	//1、创建用于连接的客户端套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket sucess cfd = %d\n",cfd); 	//3

	//设置端口号快速重用
	int reuse = 1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("端口号快速重用成功\n");
	 
	//2、绑定端口号和IP地址(非必须)
	//2.1填充客户端地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(CLI_PORT);
	cin.sin_addr.s_addr = inet_addr(CLI_IP);

	//2.2、绑定端口号和IP
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//3、连接服务器
	//3.1、填充要连接服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET; 	//地址族
	sin.sin_port = htons(SER_PORT); 	//服务器端口号
	sin.sin_addr.s_addr = inet_addr(SER_IP); 	//服务器IP地址

	//3.2、连接服务器
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("connect error");
		return -1;
	}
	printf("连接成功\n");

	//4、收发数据
	char wbuf[128] = "";
	while(1)
	{
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin); 	//从终端上获取一个字符串
		wbuf[strlen(wbuf)-1] = '\0'; 	//将换行换成 '\0'

		//判断输入的字符串值
		if(strcmp(wbuf,"quit") == 0)
		{
			break;
		}

		//将数据发送给服务器
		send(cfd,wbuf,strlen(wbuf),0);

		//将字符数据清空
		bzero(wbuf,sizeof(wbuf));
		recv(cfd,wbuf,sizeof(wbuf)-1,0);
		printf("收到的服务器消息为:%s\n",wbuf);
	}

	//5、关闭套接字
	close(cfd);

	return 0;
}

客户端连接服务器

三、UDP通信

//服务器

#include<myhead.h>
#define SER_PORT 6666
#define SER_IP "192.168.117.103"

int main(int argc, const char *argv[])
{
	//1、创建用于通信的套接字文件描述符
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success sfd = %d\n",sfd); //3

	//设置端口号快速重用
	int reuse = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("端口号快速重用成功\n");

	//2、绑定IP地址和端口号
	//2.1、填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);
	//2.2、绑定
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	
	//3、收发数据
	char rbuf[128] = "";

	//定义接收对端地址信息结构体的容器
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);

	while(1)
	{
		//清空容器
		bzero(rbuf,sizeof(rbuf));

		//接收数据
		recvfrom(sfd,rbuf,sizeof(rbuf)-1,0,(struct sockaddr*)&cin,&addrlen);
		printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);

		//回复
		strcat(rbuf," <Got it!>");
		if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cin,sizeof(cin)) == -1)
		{
			perror("write error");
			return -1;
		}
		printf("回复成功\n");
	}

	//4、关闭套接字
	close(sfd);
	
	return 0;
}

//客户端

#include<myhead.h>
#define SER_PORT 6666
#define SER_IP "192.168.117.103"
#define CLI_PORT 7777
#define CLI_IP "192.168.117.103"
int main(int argc, const char *argv[])
{
	//1、创建用于通信的套接字文件描述符
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success cfd = %d\n",cfd);

	//2、绑定IP地址和端口号
	//2.1填充客户端地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(CLI_PORT);
	cin.sin_addr.s_addr = inet_addr(CLI_IP);
	//2.2、绑定
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//3、数据收发
	char wbuf[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);

	while(1)
	{
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin); //从终端获取一个字符串
		wbuf[strlen(wbuf)-1] = 0; //将换行换成'\0'

		//判断输入的是否为退出
		if(strcmp(wbuf,"quit") ==0)
		{
			break;
		}

		//将数据发送给服务器
		sendto(cfd,wbuf,strlen(wbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("发送成功\n");

		//接收服务器发送来的消息
		bzero(wbuf,sizeof(wbuf)); //清零

		read(cfd,wbuf,sizeof(wbuf)-1);
		printf("收到服务器的消息为:%s\n",wbuf);

	}

	//4、关闭套接字
	close(cfd);

	return 0;
}

客户端连接服务器

                         

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Uni-app跟学笔记(五):uni-ui组件库的使用、项目打包(小程序、h5、APP)

文章目录 1&#xff09;uni-ui组件库的使用2&#xff09;项目打包1&#xff1a;微信小程序打包2&#xff1a;h5打包3&#xff1a;安卓打包 本博客为 uni-app 此门课的跟学笔记&#xff0c;目的是便于个人复习和对知识快速索引&#xff0c;源码素材可在均可在视频评论区找到 1&a…

Window部署AgileConfig

AgileConfig&#xff1a;分布式配置中心 github&#xff1a;GitHub - dotnetcore/AgileConfig: 基于.NET Core开发的轻量级分布式配置中心 / .NET Core lightweight configuration server 下载部署包&#xff1a;Releases dotnetcore/AgileConfig GitHub 版本&#xff1a;…

LeetCode刷题记录:(9)从中序与后序遍历序列构造二叉树

leetcode传送通道 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

HTML5:七天学会基础动画网页11

CSS3动画 CSS3过渡的基本用法: CSS3过渡是元素从一种样式逐渐改变为另一种样式的效果。 过渡属性-transition 值与说明 transition-property 必需&#xff0c;指定CSS属性的name&#xff0c;transition效果即哪个属性发生过渡。 transition-duration 必需&#xff0c;t…

基于数据库的全文检索实现

对于内容摘要&#xff0c;信件内容进行全文检索 基于SpringBoot 2.5.6Postgresqljpahibernate实现 依赖 <spring-boot.version>2.5.6</spring-boot.version> <hibernate-types-52.version>2.14.0</hibernate-types-52.version><dependency><…

挂耳式蓝牙耳机哪家的好用?一次搞定的全方位选购攻略

对于那些在锻炼时也不忘享受旋律的朋友们&#xff0c;我要透露挂耳式蓝牙耳机的魔力&#xff01;这种耳机实在是太棒了&#xff0c;我猜很多同好都跟我一样&#xff0c;在做运动时偏爱有音乐相伴&#xff0c;以点燃我们的运动激情。但使用传统入耳式蓝牙耳机跑步时&#xff0c;…

综合利用Cisco Packet Tracer模拟器配置园区网

1. 内容 1.在课室交换机中创建各个课室的VLAN&#xff0c;并将1-20端口平均分配给各个课室。 2.使用课室交换机的每个端口只能接入一台计算机&#xff0c;发现违规就丢弃未定义地址的包。3.网络内部使用DHCP分配各课室的IP地址&#xff0c;在课室交换机按照第一题划分的VLAN地…

ThinkBook 14 G3 ITLC(21A3)原厂Win11系统下载,恢复开箱预装oem系统

lenovo联想ThinkBook 14 G3 笔记本电脑原装出厂Windows11系统镜像安装包 链接&#xff1a;https://pan.baidu.com/s/1MZj2Fm7NYUsCwcT9pFGb8Q?pwdajf0 提取码&#xff1a;ajf0 联想笔记本原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、联想…

【Linux】Centos7安装Nginx1.21.6

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件( IMAP/POP3)代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;中国大陆使nginx的网站有:百度、京东、新浪、网易、腾讯、淘宝等。 …

蓝桥杯单片机快速开发笔记——HC573/HC138

一、原理分析 二、思维导图 三、代码参考 #include "HC573.h" #include "reg52.h"void Set_HC573(unsigned char channel, unsigned char dat) {P2 (P2 & 0x1f) | 0x00; //赋值之前&#xff0c;关闭全部锁存器P0 dat; //保存待设置…

钉钉小程序 - - - - - 如何通过一个链接打开小程序内的指定页面

方式1 钉钉小程序 scheme dingtalk://dingtalkclient/action/open_mini_app?miniAppId123&pagepages%2Findex%2Findex%3Fx%3D%25E4%25B8%25AD%25E6%2596%2587 方式2 https://applink.dingtalk.com/action/open_mini_app?type2&miniAppIdminiAppId&corpIdcorpId&…

【Git】error: bad signature 0xb86f1e1 和 bfatal: index file corrupt

一、问题 之前都好好的&#xff0c;今天执行 git add .的时候突然报错 报错原因翻译成中文&#xff1a;索引文件损坏 二、解决方法 方法1&#xff1a; 删除.git隐藏文件夹中的index文件 然后执行 git reset 重新生成index文件 git reset 方法2&#xff1a; 重新从远程克隆…

css之常用样式

展示样式一&#xff1a; <div class"showListBox"><div class"List" v-for"(i,index) in sealList" :key"index"> <div class"ListItemCon"><div class"ListItem-titleBox"><img src…

沉浸式感受旧时光,VR全景让游客都爱上老街区打卡地

近年来&#xff0c;随着城市建设的推进&#xff0c;很多老建筑以及周边的道路都发生了很大的变化&#xff0c;为了让更多的游客可以领略城市发展的进程以及旧时的人文风情&#xff0c;很多城市都会通过实地场景拍摄制作VR全景&#xff0c;将老街区、老建筑的真实场景进行虚拟再…

「SpringBrick快速入门指南」:☀️ 后端领域新兴技术璀璨之星☀️ 基于Spring Boot的高级插件化开发框架

文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | Change 插件配置集成 | Settings引入依赖 | XML定义插件引导类 | Clas…

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型

目录 往期精彩内容&#xff1a; 前言 1 轴承数据加载与预处理 1.1 导入数据 1.2 数据预处理&#xff0c;制作数据集 3 基于Pytorch的CNN-Transfromer轴承故障诊断分类 3.1 定义CNN-Transfromer分类网络模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 代码、数据…

openstack(T)启动实例状态为错误,如何解决

---基本服务得是正常的 ---1.在web界面看是什么错误 点击你的实例名称&#xff0c;在概况里面去查看 当时我的error &#xff1a;编码500 消息 No valid host was found. 错误原因 1&#xff1a;资源不足 2&#xff1a;未开启虚拟机cpu虚拟化 解决&#xff1a; 1.资源不…

plotnine,一个非常实用的 Python 库!

大家好&#xff0c;今天为大家分享一个非常实用的 Python 库 - plotnine。 Github地址&#xff1a;https://github.com/has2k1/plotnine 在数据分析和可视化领域&#xff0c;Python 提供了许多强大的工具和库。其中&#xff0c;plotnine 是一个基于 Grammar of Graphics 理论的…

vmware workstation虚拟机报错”该虚拟机似乎正在使用中“

虚拟机报错&#xff1a; 解决方法&#xff1a; 进入到虚拟机的安装目录里&#xff0c;将lck结尾的文件删掉即可 重新点击虚拟机恢复正常

Nacos2.3.1集群部署

Nacos集群部署 1、下载安装包 https://github.com/alibaba/nacos/releases/download/2.3.1/nacos-server-2.3.1.tar.gz2、解压安装包 tar -xf nacos-server-2.3.1.tar.gz3、java环境配置 3.1、下载jdk17 https://download.oracle.com/java/17/archive/jdk-17.0.10_linux-x64…
最新文章