网络编程 0903作业

news2024/9/22 10:06:10

作业

1、将TCP的CS模型再敲一遍

tcpserver.c

#include <myhead.h>
#define SERPORT 1111
#define SERIP "192.168.58.128"
#define BACKLOG 40
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_STREAM,0);//1、产生一个原始套接字文件描述符
	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地址为本机IP
	};//定义服务器地址结构体变量
	if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1)//2、绑定ip
	{
		perror("bind");
		return -1;
	}
	printf("绑定成功\n");
	if(listen(oldfd,BACKLOG)==-1)//3、监听客户端请求
	{
		perror("listen");
		return -1;
	}
	printf("监听成功\n");

	//使用新描述符通信
	char buff[1024] = "";
	int newfd;
	struct sockaddr_in  cin;//定义获取客户端信息的结构体
	socklen_t cinlen = sizeof(cin);//获取结构体大小
	newfd = accept(oldfd,(struct sockaddr *)&cin,&cinlen);//4、接收请求,创建新的描述符用于通信
	if(newfd==-1)
	{
		perror("accept");
		return -1;
	}
	printf("%s:%d客户端发来连接请求\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
	while(1)//5、收发消息
	{


		//int len = read(newfd,buff,sizeof(buff));
		memset(buff,0,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;
}

tcpclient.c

#include <myhead.h>

#define CLIPORT 1111
#define CLIIP "192.168.58.128"
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_STREAM,0);//1、创建原始套节字
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、bind可选


	//3、连接服务器
	struct sockaddr_in cin = {
		.sin_family = AF_INET,//IPV4通信
		.sin_port = htons(CLIPORT),//端口号转为网络字节序
		.sin_addr.s_addr = inet_addr(CLIIP)//IP地址转为网络字节序
	};

	if(connect(oldfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
	{
		perror("connect");
		return -1;
	}
	printf("连接服务器成功\n");
	char buff[1024] = "";
	while(1)//4、收发消息
	{
		memset(buff,0,sizeof(buff));
		printf("客户端发信息:");
		fgets(buff,sizeof(buff),stdin);

		send(oldfd,buff,sizeof(buff),0);//阻塞发送

		recv(oldfd,buff,sizeof(buff),0);//阻塞接收
		printf("收到服务器的消息:%s\n",buff);
	}
	close(oldfd);
	return 0;
}

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

udpserver.c

#include <myhead.h>
#define SERPORT 8888
#define SERIP "192.168.58.128"

int main(int argc, const char *argv[])
{
	//1、创建套接字
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);//SOCK_DGRAM:UDP
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、绑定
	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;
	}
	//3、收发消息
	struct sockaddr_in cin;
	socklen_t cinlen = sizeof(cin);

	connect(sockfd, (struct sockaddr*)&cin, 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(len==0)
		{
			printf("客户端跑了\n");
			break;
		}
		printf("服务器接收的信息:%s\n",buff);
		//printf("服务器发消息:");
		//fgets(buff,sizeof(buff),stdin);
		//sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&cin,sizeof(cin));
		//printf("发送成功\n");
	}
	close(oldfd);
	return 0;
}

udpclient.c

#include <myhead.h>
#define CLIPORT 8888
#define CLIIP "192.168.58.128"
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);//1、创建套接字
	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)//2、收发信息
	{
		printf("客户端发消息:");
		fgets(buff,sizeof(buff),stdin);
		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&cin,sizeof(cin));
		printf("发送成功\n");
	}
	close(oldfd);
	return 0;
}

知识梳理

TCP和UDP通信基础:

基于TCP通信的流程

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

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

相关文章

pikachu文件包含漏洞靶场

File inclusion(local) 创建1.php 步骤一&#xff1a;选择一个球员提交 ../../../../1.php File Inclusion(remote)&#xff08;远程文件包含&#xff09; 步骤一&#xff1a;更改参数 php.ini ⾥有两个重要的参数 allow_url_fopen 、allow_url_include &#xff1b; 步骤二…

玩机进阶教程-----如何通过boot查看当前机型版本号 型号以及启动分区 提升保资料写固件成功率

在玩机过程中我们会遇到一些无法开机进系统的机型。而有需要其中的数据。如果简单的写入固件。可能会由于与当前机型版本不符或者版本差别太大的缘故而导致资料无法保存。如果当前机型有版本仿回滚机制。那么有可能误刷系统也会不开机。那么如何通过简单的操作来查看当前机型的…

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务 1.实现单帧降噪 2.实现多帧投影 3.实现多帧累积 Bonus:使用-Trous Wavelet 加速单帧降噪 实现 单帧降噪 这里实现比较简单&#xff0c;直接根据给出的联合双边滤波核的公式就能实现 Buffer2D<Float3> Denoiser::Filter(const FrameInfo &frameInfo) {int heigh…

科研小白教程|如何远程连接实验室服务器跑代码?

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【计算机系统架构】从0开始构建一台现代计算机|时序逻辑、主存储器|第3章每日一言&#x1f33c;: 总之岁月漫长&#xff0c;然而值得等待。—…

国内可以免费使用的gpt网站【九月持续更新】

GPT Hub 是我最近使用的一款智能文本生成工具平台&#xff0c;它支持多种AI模型&#xff0c;包括最新的GPT-4模型&#xff0c;并且可以在国内网络环境中直接访问。以下是我在使用过程中发现的一些特点&#xff1a; 多功能支持&#xff1a;不仅支持代码生成&#xff0c;还涵盖了…

【主机入侵检测】Wazuh解码器之JSON解码器

前言 Wazuh 是一个开源的安全平台&#xff0c;它使用解码器&#xff08;decoders&#xff09;来从接收到的日志消息中提取信息。解码器将日志信息分割成字段&#xff0c;以便进行分析。Wazuh 解码器使用 XML 语法&#xff0c;允许用户指定日志数据应该如何被解析和规范化。解码…

Java基础(10)- 学生管理系统项目

一、JavaBean编写 public class Student {private int id;private String name;private int age;private String sex;public Student() {}public Student(int id, String name, int age, String sex) {this.id id;this.name name;this.age age;this.sex sex;}public int g…

绝对定位导致内容自动换行问题解决

今天在做一个定位元素的时候遇到一个嵌套定位之后&#xff0c;使用绝对定位的元素的内容自动换行的问题&#xff0c;希望不换行只在一行显示。 可以通过添加 white-space: nowrap; 样式控制不换行 <div class"box"><div class"box1"><div …

深入剖析:中国国际大学生创新大赛中不可忽视的12个扣分点

深入剖析&#xff1a;中国国际大学生创新大赛中不可忽视的12个扣分点 前言1. 项目名称&#xff1a;第一印象的力量2. 项目逻辑&#xff1a;清晰的思路是关键3. 问题分析&#xff1a;深入挖掘痛点4. 需求分析&#xff1a;解决方案的导向5. 科研课题与评审维度的匹配6. 团队介绍&…

DataWhale AI夏令营-《李宏毅深度学习教程》笔记-task3

DataWhale AI夏令营-《李宏毅深度学习教程》笔记-task2 第五章 循环神经网络5.1 独热编码5.2 RNN架构5.3 其他RNN5.3.1 Elman 网络 &Jordan 网络5.3.2 双向循环神经网络 第五章 循环神经网络 循环神经网络RNN&#xff0c;RNN在处理序列数据和时间依赖性强的问题上具有独特…

渗透测试靶机--- DC系列 DC-6

渗透测试靶机— DC系列 DC-6 开启靶机&#xff0c;登录页面&#xff0c;平平无奇 扫描ip&#xff0c;端口&#xff0c;服务等信息 访问80&#xff0c;发现这里是WordPress站点 直接wpscan扫描一下用户名wpscan --url http://wordy -e u 这里可以将扫出来的五个用户名保存&…

WPF性能优化之UI虚拟化

文章目录 前言一、VirtualizingStackPanel1.1 虚拟化功能介绍1、在Window中添加一个ListBox控件。2、在设计视图中用鼠标选中ListBox控件并右健依次单击“编辑其他模板”&#xff0d;“编辑项的布局模板”&#xff0d;“编辑副本”。3、查看生成的模板代码。 1.2 虚拟化参数介绍…

如何提升网站权重?

提升网站权重的方法有很多&#xff0c;常规的方法包括内容优化、关键词研究、页面结构调整、提高用户体验等。但这些方法往往需要时间来见效。如果你希望在短时间内看到显著的提升&#xff0c;发外链是一个非常有效的策略。 外链是提升网站权重的有效方法&#xff0c;但需要注…

9月3c++

封装栈和队列 队列 #include <iostream> #include <cstring> using namespace std; class Myqueue { private:int data[256];int size0; public:Myqueue(){}//无参构造~Myqueue(){}//析构//拷贝赋值Myqueue & operator(const Myqueue &other){if(this!&a…

C++ ─── List的模拟实现

一&#xff0c; List的模拟实现 List 是一个双向循环链表,由于List的节点不连续&#xff0c;不能用节点指针直接作为迭代器&#xff0c;因此我们要对结点指针封装&#xff0c;来实现迭代器的作用。 迭代器有两种实现方式&#xff0c;具体应根据容器底层数据结构实现&#xff1…

15、VSCode自定义Markwown编辑环境

前言 &#xff1a;Visual Studio Code (VSCode) 是微软推出的一款开源编辑器&#xff0c;使用 Electron 打造&#xff0c;与 Atom 齐名&#xff0c;不过随着 Atom 社区的渐渐缩小&#xff0c;VSCode 的影响力开始越来越大了。VSCode 内置了 Markdown 语言及预览的支持&#xff…

每周12600元奖金池,邀你与昇腾算力共舞,openMind开发者盛宴启幕!

小伙伴们&#xff0c;是否瞬间被这个标题唤醒了在OpenI启智社区“我为开源打榜狂”黄金时代的温馨记忆&#xff1f;打榜活动虽已谢幕&#xff0c;但大家相伴度过12期的那份激情与创新的共鸣&#xff0c;促使OpenI启智社区在国产算力崛起的浪潮中勇立潮头&#xff0c;推出了“芯…

JavaScript是什么

前言 初始JavaScript JavaScript是什么 JavaScript (简称 JS) 是世界上最流行的编程语言之一 是一个脚本语言, 通过解释器运行 主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 最初只是为了完成简单的表单验证(验证数据合法性), 结果后…

git 回滚的三种方式

按照从旧到新的顺序 你依次提交了 1 2 3 4 5 现在你想回到1 如何操作 第一种方法 hard reset git reset --hard 执行命令后 你会发现 效果实现了 东西都回到了那次更改 但是2345的更改都没了 并且你会发现 你有更新 这是因为这个hard reset 只会改本地的 远程的不改 一更新就…

7.Lab Six —— Cow Fork

首先切换分支到cow git checkout cow make clean Implement copy-on write 实现写时复制&#xff0c;为了测试方案&#xff0c;以及提供了一个cowtest的xv6程序&#xff0c;位于user/cowtest.c当中 课程给了一个合理的攻克计划&#xff1a; 修改uvmcopy()将父进程的物理页映…