网络编程TCP和UDP

news2024/11/13 11:10:54
将TCP的CS模型再敲一遍

TCP服务器

1->创建原始的套接字描述符

2->将原始套接字与主机ip绑定

3->将原始套接字设置监听状态

4->接收客户端连接,获取客户端信息,因为原始套接字被用了,所以创建新的套接字描述符用于客户端通信

5->发送接收信息

6->关闭

#include <myhead.h>

#define SERPORT 3456
#define SERIP "192.168.0.102"
#define BACKLOG 5
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_STREAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	printf("旧的套接字创建成功\n");
	//2.绑定主机的IP和端口号
	struct sockaddr_in sin = {
		.sin_family = AF_INET,//使用IPv4通信协议族
		.sin_port = htons(SERPORT),//设置端口号
		.sin_addr.s_addr = inet_addr(SERIP)//设置IP地址为本机地址
	};//定义服务器地址结构体变量

	if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin)) == -1)//绑定ip
	{
		perror("bind");
		return -1;
	}
	printf("绑定成功\n");
	if(listen(oldfd,BACKLOG) == -1)//监听客户端需求
	{
		perror("listen");
		return -1;
	}
	printf("监听成功\n");

	char buff[1024];
	
	struct sockaddr_in cin;//定义获取客户端信息结构体
	socklen_t cinlen = sizeof(cin);//获取结构体大小
	int newfd = accept(oldfd,(struct sockaddr *)&cin,&cinlen);//接收请求,创建新的描述符
	if(newfd == -1)
	{
		perror("accept");
		return -1;
	}
	printf("%s:%d客户端发来连接请求\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
	while(1)
	{
		memset(buff,0,sizeof(buff));
		//int len = read(newfd,buff,sizeof(buff));
		int len = recv(newfd,buff,sizeof(buff),0);
		printf("读取的信息:%s\n",buff);
		if(len == 0)
		{
			printf("你客户跑了\n");
		}
		strcat(buff,"520");
		//write(newfd,buff,sizeof(buff));
		send(newfd,buff,sizeof(buff),0);
		memset(buff,0,sizeof(buff));

	}
	close(oldfd);
	close(newfd);
	return 0;
}

TCP客户端

1->创建原始套接字描述符

2->可以绑定也可以不绑定,这里就没有绑定了

3->连接服务器,创建结构体用于接收自己的信息,在连接时要带上自己“身份”

4->发送接收信息

5->关闭

#include <myhead.h>

#define SERPORT 3456
#define SERIP "192.168.0.102"
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_STREAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	//2.绑定(可选)
	//连接服务器
	struct sockaddr_in cin = {
		.sin_family = AF_INET,//使用IPv4通信协议族
		.sin_port = htons(SERPORT),//设置端口号
		.sin_addr.s_addr = inet_addr(SERIP)//设置IP地址为本机地址
	};//定义服务器地址结构体变量

	if(connect(oldfd,(struct sockaddr *)&cin,sizeof(cin)) == -1)
	{
		perror("connect");
		return -1;
	}
	printf("连接成功\n");
	char buff[1024];
	while(1)
	{
		memset(buff,0,sizeof(buff));
		printf("客户端发信息");
		fgets(buff,sizeof(buff),stdin);
		buff[strlen(buff)-1] = '\0';
		send(oldfd,buff,sizeof(buff),0);

		recv(oldfd,buff,sizeof(buff),0);
		printf("收到服务器信息%s\n",buff);
	}
	close(oldfd);
	return 0;
}

UDP服务器中,使用connect函数,实现唯一的客户端与服务器通话

UDP服务器

UDP服务器可以不连接(connect),连接后会与指定的客户端通信,不会接收其他客户端信息

代码中当接收到ccc字符串的时候使用connect函数,就只与发ccc字符串的客户端通信了

#include <myhead.h>

#define SERPORT 8888
#define SERIP "192.168.0.102"
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);
	if(-1 == oldfd)
	{
		perror("socket");
		return -1;
	}

	struct sockaddr_in sin = {
		.sin_family = AF_INET,
		.sin_port = htons(SERPORT),
		.sin_addr.s_addr = inet_addr(SERIP)
	};

	if(bind(oldfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind");
		return -1;
	}

	struct sockaddr_in cin;
	socklen_t cinlen = sizeof(cin);
	char buff[100];
	while(1)
	{
		memset(buff,0,sizeof(buff));
		int len = recvfrom(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&cin,&cinlen);
		if(strcmp(buff,"ccc")==0)
		{
			connect(oldfd,(struct sockaddr*)&cin,cinlen);
		}
		if(len == 0)
		{
			printf("客户端跑了\n");
			break;
		}
		printf("服务器接收到信息:%s\n",buff);

		//strcat(buff,"666");
		//sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&sin,sizeof(sin));
		//printf("发送成功\n");
		//memset(buff,0,sizeof(buff));
	}
	close(oldfd);
	
	return 0;
}

UDP客户端

#include <myhead.h>

#define CLIPORT 8888
#define CLIIP "192.168.0.102"
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	
	struct sockaddr_in cin = {
		.sin_family = AF_INET,
		.sin_port = htons(CLIPORT),
		.sin_addr.s_addr = inet_addr(CLIIP)
	};
	char buff[1024];
	while(1)
	{
		printf("客户端发信息:");
		fgets(buff,sizeof(buff),stdin);
		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&cin,sizeof(cin));
		printf("发送成功");

	}
	close(oldfd);
	
	return 0;
}
TCP和UDP的思维导图

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

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

相关文章

2区SCI仅52天直录!9月甄选SCI/SSCI合集(含各领域)

【SciencePub学术】我处SciencePub学术2024年9月SCI/SSCI/EI/CNKI刊源表已更新&#xff01;内含多本中科院TOP、CCF推荐以及进展超顺的优质期刊&#xff0c;最快1-2个月录用&#xff01; 计算机领域重点SCI 环境地质化学领域重点SCI 生物医学领域重点SCI 数学材料物理领域重点S…

拥有这些AI绘画网站,让你轻松告别手绘时代!

在这个充满无限可能的数字世界里&#xff0c;AI 绘画动漫网站已经成为了许多艺术家和设计师的新宠。从手绘时代的岁月如歌&#xff0c;到今天科技的飞速发展&#xff0c;我们已经可以用AI技术创作出令人惊叹的艺术作品&#xff0c;打开了全新的创作空间。接下来&#xff0c;就让…

图形化编程011

项目描述&#xff1a; 点击绿旗&#xff0c;点击空格键&#xff0c;角色向上游动&#xff0c;松开空格键&#xff0c;角色向下飘落。 浮游生物碰到角色会发出声音并隐藏&#xff0c;碰到舞台边缘会重新出现。 30秒后程序结束 。 拆解步骤&#xff1a; 1、添加背景和角色以及…

如何打造一个智能化的远程在线考试系统?

远程教育与在线考试已成为提升知识传播效率和学习灵活性的重要手段。 土著刷题在线考试系统&#xff0c;凭借其完善的多功能考试模块&#xff0c;为教育机构、学校乃至企业提供了一个智能化的远程在线考试解决方案。 接下来将介绍土著刷题在线考试系统如何助力用户构建一个高效…

第L3周:机器学习-逻辑回归

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 逻辑回归适用于分类问题&#xff0c;主要用于解决二分类或多分类的问题。比如&#xff1a;用户购买某商品的可能性&#xff0c;某病人患有某…

单端输入与差分输入

单端输入&#xff1a; 单端输入测量的是一根导线与地之间的电压差&#xff0c;然后将这个差值放大以提供输出。 然而&#xff0c;单端输入容易受到噪声的影响&#xff0c;因为承载信号的导线会吸收电背景噪声。此外&#xff0c;单端输入上的信号还可能受到地环路的影响。 例…

鸿蒙(API 12 Beta6版)图形【NativeDisplaySoloist开发指导】方舟2D图形服务

如果开发者想在独立线程中进行帧率控制的Native侧业务&#xff0c;可以通过DisplaySoloist来实现&#xff0c;如游戏、自绘制UI框架对接等场景。 开发者可以选择多个DisplaySoloist实例共享一个线程&#xff0c;也可以选择每个DisplaySoloist实例独占一个线程。 接口说明 函…

【MySQL00】【 杂七杂八】

文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…

宝藏!《联盟现代控制特训班题库》(麒麟篇) 讲义部分:甄选内容

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;初试《现代控制特性班题库》(麒麟篇)&#xff0c;分为讲义和习题两个部分&#xff0c;本文为讲义部分的甄选内容&#xff0c;一本书帮你学透现控。 目录 Part1&#xff1a;资料封面&目录 讲义部分目录 Part2&…

为什么很多人都还用着Win10 而不投向Win11的怀抱?

前言 自从Windows 11发布&#xff08;2021年6月&#xff09;不知不觉已经过去了3年了。在这三年期间&#xff0c;Windows 11经历了几个大版本的更新。 Windows 10从正式发布开始&#xff08;2015年7月&#xff09;至现在已经有9年的历史。而Windows 10的最后一个版本22H2即将在…

2024年河南省成人高考报名指南

2024年河南省成人高考报名指南 河南省成人高考预计9月初g网报名&#xff0c;一般一周时间结束&#xff0c;预计到9月中旬报名截止‼不清楚报名流程同学看过来&#xff0c;今天老师给大家详细介绍一下&#xff01; 想参加河南成人高考需要什么条件&#xff0c;具体的报名流程是什…

AD19基础应用技巧:捕捉对象功能的讲解鼠标”绿色十字”大光标、小光标切换

AD PCB 中心点捕捉功能&#xff1a; 线段、圆、边框中心点捕捉。 有时候不想要鼠标自动捕捉中心点怎么办&#xff1f; 关于Altium Designer 20 的捕抓功能的讲解&#xff08;https://blog.csdn.net/weixin_44599693/article/details/126177841&#xff09; ——- AD PCB画板…

基于VsCode和Git的代码版本管理

基础回退 在项目文件夹右键打开git bash&#xff0c;输入命令git log 查看提交的历史 commit&#xff0c;git log --prettyoneline将版本信息压缩到一行 使用git log可能会显示不全&#xff0c;按enter逐行查看&#xff0c;按end跳至末尾查看完成后&#xff0c;按q即可退出 …

湖南省工业废水高氯酸盐排放新标准解析与技术应对策略

随着工业化进程的加快&#xff0c;环境污染问题变得尤为突出。特别是在某些特定行业产生的污染物&#xff0c;如高氯酸盐&#xff0c;因其对环境和人体健康的潜在危害&#xff0c;越来越受到关注。为了解决这一问题&#xff0c;湖南省生态环境厅与省市场监督管理局联合制定了《…

AN7536PT时钟电路

目录 1 时钟电路概述2 时钟晶振电路2.1 需求分析2.2 晶振选型&#xff08;Datasheet表5-7解读&#xff09;2.3 设计晶振电路&#xff08;表4-1、图5-4&#xff09; 1 时钟电路概述 时钟电路是一种用于产生稳定、周期性脉冲信号的电子电路。它通常由晶体振荡器和相关逻辑电路组…

Kettle 锁表原因及解决办法【源码级分析】

文章目录 背景源码分析锁表场景1:资源库锁表锁表场景2:写日志锁表在哪里配置的kettle_log_table?官方解释自增 SQL 获取 BatchI 原理解决自增 SQL 获取 BatchID背景 Kettle 7.1.0 经常出现锁表的情况,体现为在数据库里有一条锁表 SQL,然后整个 Kettle 都无法运行。😂�…

java简介以及单个或两个及以上java安装与环境变量配置

目录 1.java简介 1.1 Java 的主要特点包括 1.2 Java 的主要用途包括&#xff1a; 1.3 java下载地址 2.安装java 2.1 安装程序 2.2选择安装路径 2.3等待安装 3.首先&#xff0c;进入环境变量 3.1 找到设置&#xff08;第一个win11&#xff0c;第二个win10&#xff09;…

走心机加工滚花滚齿工艺

走心机加工滚花工艺是一种高精度、高效率的加工方式&#xff0c;广泛应用于需要精细纹理和美观外观的零部件制造中。以下是对走心机加工滚花工艺的详细解析&#xff1a; 一、工艺概述 走心机加工滚花工艺&#xff0c;顾名思义&#xff0c;是利用走心机&#xff08;也称为走心车…

卷积神经网络(Datawhale X 李宏毅苹果书AI夏令营)

卷积神经网络(Datawhale X 李宏毅苹果书AI夏令营) 卷积神经网络是一种非常典型的网络 架构&#xff0c;常用于图像分类等任务。 一张图像是一个三维的张量&#xff0c;其中一维代表图像的 宽&#xff0c;另外一维代表图像的高&#xff0c;还有一维代表图像的通道&#xff08;…

【Tensor】(基础篇一) —— 安装TensorFlow和介绍Tensor

安装TensorFlow和介绍Tensor 之前我们已经学了一些简单的回归和神经网络&#xff0c;但程序员之间“不重复造轮子”这个指导思想让我们可以不用每次在使用机器学习算法的时候都进行手动从底层开始搭建&#xff0c;回归很多在sklearn中进行了集成&#xff0c;神经网络中很多内容…