网络 / day02 作业

news2024/11/26 16:36:30

1. TCP和UDP通信模型

1.1 TCP server

#include <myhead.h>

#define PORT 9999
#define IP "192.168.250.100"

int main(int argc, const char *argv[])
{
	//1. create socket
	int sfd = -1;

	if( (sfd = socket(AF_INET, SOCK_STREAM, 0 ))==-1   )
	{
		perror("socket error");
		return -1;
	
	}
	//param1: AF_INET -->ipv4 domain  
	//param2: AF_INET --> tcp protocal
	//param3; if param2 has specified only protocal, fill 0
	//returned: On success, a file descriptor for the new socket is returned.  On error, -1 is returned, and errno is set appropriately.
	printf("sfd = %d\n", sfd);  
	

	//2. bind address info struct
	struct sockaddr_in sin;

	sin.sin_family = AF_INET; //ipv4
	sin.sin_port = htons(PORT); // htons --> port in network bytes order
	sin.sin_addr.s_addr = inet_addr(IP); //inet_addr--> address in network bytes order

	if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1 )
	{
		perror("bind error");
		return -1;
	
	}
	//assigns the address specified by addr to the socket referred to by the file descriptor sockfd.  
	//addrlen  specifies  the  size,  in bytes, of the address structure pointed to by addr. 
	printf("bind success _%d_%s_%s\n", __LINE__, __FILE__, __func__);	
	

	//3. listen() 
	if( listen(sfd, 128) ==-1   )
	{
		perror("listen error");
		return -1;
	}
	//listen()  marks  the  socket  referred to by sockfd as a passive socket, 
	//that is, as a socket that will be used to accept incoming connection requests using accept(2).
	printf("listen success _%d_%s_%s\n", __LINE__, __FILE__, __func__);

	//4. accept
	/*if(accept(sfd, NULL, NULL) == -1 ) // NULL, NULL means skip client info
	{
		perror("accept error");
		return -1;
	}
	printf("accept success _%d_%s_%s\n", __LINE__, __FILE__, __func__);
	*/

	// 4.1 accept, recv client info
	// define client info struct
	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);

	//4.2 recv client requests
	int newfd = -1;
	if( (newfd = accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1 )
	{
		perror("accept error");
		return -1;
	}

	printf("[%s:%d] accept success, newfd = %d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);

	//5. data send/recv
	char rbuf[128] = "";
	while(1)
	{
		//clean buf
		bzero(rbuf, sizeof(rbuf));

		int res = recv(newfd, rbuf, sizeof(rbuf), 0);
		//param1: file descriptor
		//param2: buff
		//param3: size
		//param4: block
		if(res == 0)
        {
            printf("client off line\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

		//send back msg to clinet
		strcpy(rbuf, "\n*_*\n");
		send(newfd, rbuf, sizeof(rbuf), 0);
	
	}

	close(newfd);
	close(sfd);


	return 0;
}

1.2 TCP client

#include <myhead.h>

#define PORTSVC 9999
#define IPSVC "192.168.250.100"

#define PORTCLI 6666
#define IPCLI "192.168.250.100"


int main(int argc, const char *argv[])
{
	//1. create socket
	int cfd = -1;

	if( (cfd = socket(AF_INET, SOCK_STREAM, 0))==-1 )
	{
		perror("socket error");
		return -1;
	}

	printf("cfd = %d\n", cfd);


	//端口号快速重用
	int reuse = -1;
	if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}

	//2. binding
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(PORTCLI);
	cin.sin_addr.s_addr = inet_addr(IPCLI);

	if(bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1)
	{
		perror("bind error");
		return -1;
	
	}

	printf("bind success\n");

	
	//3. connect server
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORTSVC);
	sin.sin_addr.s_addr = inet_addr(IPSVC);

	if( connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
	{
		perror("connect error");
		return -1;
	
	}

	//4. data send/recv
	char wbuf[128] = "";

	while(1)
	{
		bzero(wbuf, sizeof(wbuf));

		//input text
		fgets(wbuf, sizeof(wbuf), stdin);
		wbuf[strlen(wbuf) - 1] = 0;

		if(strcmp(wbuf, "quit") == 0)
		{
			printf("exit client\n");
			break;
		}

		//send data to svc
		send(cfd, wbuf, sizeof(wbuf), 0);

		//data recv
		bzero(wbuf, sizeof(wbuf));

		int res = recv(cfd, wbuf, sizeof(wbuf), 0);
		if(res == 0)
		{
			printf("server is off line\n");
			break;
		
		}

		printf("[%s:%d]: %s\n", IPSVC, PORTSVC, wbuf);
	
	}

	close(cfd);


	return 0;
}

2.1 upd server

#include <myhead.h>

#define PORT 9999
#define IP "192.168.250.100"


int main(int argc, const char *argv[])
{
	//1. create socket
	int sfd = -1;
	if( (sfd=socket(AF_INET, SOCK_DGRAM, 0 )) == -1 )
	{
        perror("socket error");
        return -1;	
	}
	printf("sfd=%d\n", sfd);

	// port resue
	int reuse = 1;
	if( setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1 )
	{
		 perror("setsockopt error");
        return -1;
	}

	//3. bind IP
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);
	
	if(bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
	{
		perror("setsockopt error");
        return -1;

	}
	printf("bind success\n");

	//4. data recv/send
	char buf[128] = "";

	//addr struct 
	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);

	while(1)
	{
		bzero(buf, sizeof(buf));

		recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &socklen);
	  	printf("[%s:%d]: %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

		//feedback to clinet
		strcpy(buf, "*_*");
		sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr *)&cin, sizeof(cin) );

		printf("send success\n");
	
	}

	close(sfd);



	return 0;
}

2.2 upd client

#include <myhead.h>

#define PORT 9999
#define IP "192.168.250.100"

int main(int argc, const char *argv[])
{
	//1. create socket
	int cfd =-1;

	if( (cfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1   )
	{
	    perror("socket error");
        return -1;
	
	}
	printf("cfd = %d\n", cfd);


	//2. binding ip, optional
	
	//3. define addr struct for data sending
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	char buf[128] = "";
	//struct sockaddr_in cin;

	//socklen_t socklen = sizeof(cin);



	while(1)
	{
		bzero(buf, sizeof(buf));

		// send data to server
		fgets(buf, sizeof(buf), stdin);
		buf[strlen(buf) - 1] = 0;

		sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr *)&sin, sizeof(sin));


		//recv data from server
		recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL );
		printf("msg from svc: %s\n", buf);
	
	
	}

	
	return 0;
}

2. 思维导图

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

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

相关文章

YOLOv5改进 | SPPF | 将RT-DETR模型AIFI模块和Conv模块结合替换SPPF(全网独家改进)

一、本文介绍 本文给大家带来是用最新的RT-DETR模型中的AIFI模块来替换YOLOv5中的SPPF。RT-DETR号称是打败YOLO的检测模型&#xff0c;其作为一种基于Transformer的检测方法&#xff0c;相较于传统的基于卷积的检测方法&#xff0c;提供了更为全面和深入的特征理解&#xff0c…

机器学习 | KNN算法

一、KNN算法核心思想和原理 1.1、怎么想出来的&#xff1f; 近朱者赤&#xff0c;近墨者黑&#xff01; 距离决定一切、民主集中制 1.2、基本原理 —— 分类 k个最近的邻居 民主集中制投票分类表决与加权分类表决 1.3、基本原理 —— 回归 计算未知点的值决策规则不同均值法与…

Vue2-动态组件案例

1.component介绍 说明&#xff1a; Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is&#xff0c;它会被视为组件的名称&#xff0c;用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…

西南科技大学数字电子技术实验六(智力竞赛抢答器的设计及FPGA实现)FPGA部分

一、实验目的 进一步掌握D触发器&#xff0c;分频电路&#xff0c;多谐振荡电器&#xff0c;CP时钟脉冲元等单元电路的设计。 二、实验原理 三、程序清单&#xff08;每条语句必须包括注释或在开发窗口注释后截图&#xff09; 逻辑代码&#xff1a; module contend ( inpu…

OpenCV 1.1:读取本地图片显示灰度图及CV版本

imread方法加载图像 imread 功能是加载图像文件成为一个 Mat 对象&#xff0c;其中第一个参数表示图像文件名称&#xff0c;第二个参数表示加载的图像是什么类型&#xff0c;支持常见的三个参数值IMREAD_UNCHANDED(<0) 表示加载原图&#xff0c;不做任何改变IMREAD_GRAYSCA…

Docker插件和扩展:深入Docker功能的完整指南

Docker作为一种流行的容器化技术&#xff0c;不仅令应用程序的部署更为便捷&#xff0c;同时也提供了丰富的插件和扩展机制&#xff0c;以满足更多复杂场景下的需求。本文将深入研究Docker的插件和扩展&#xff0c;提供更为详实和全面的示例代码&#xff0c;助力读者更好地理解…

DPO讲解

PPO算法的pipeline冗长&#xff0c;涉及模型多&#xff0c;资源消耗大&#xff0c;且训练极其不稳定。DPO是斯坦福团队基于PPO推导出的优化算法&#xff0c;去掉了RW训练和RL环节&#xff0c;只需要加载一个推理模型和一个训练模型&#xff0c;直接在偏好数据上进行训练即可&am…

计算机出现xinput1_3.dll缺失、五种详细解决方案

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是xinput1_3.dll丢失。这个错误提示通常会导致游戏或其他应用程序无法正常运行。那么&#xff0c;xinput1_3.dll文件到底是什么&#xff1f;它丢失会对电脑产生什么影响&#xff1f;本文将为您详…

1688订单详情对接及实现方案

一、引言 1688作为中国最大的B2B电子商务平台之一&#xff0c;提供了丰富的商品信息和订单详情。通过与1688订单详情接口的对接&#xff0c;电商企业可以实时获取订单详细信息&#xff0c;以便更好地了解客户需求、优化运营策略以及提高服务质量。本文将详细介绍如何实现1688订…

《数据结构、算法与应用C++语言描述》-机器调度-最长处理时间(LPT)-堆应用

机器调度 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_28LongestProcessingTime 问题描述 一个工厂具有 m台一模一样的机器。我们有n 个任务需要处理。设作业i的处理时间为 t i t_i ti​&#xff0c;这个时间包括把作业放入机器…

【PostgreSQL】从零开始:(十二)PostgreSQL-数据库对象关系及定义

从图中我们可以看出服务器对象的关系 现在我们来了解它们的定义 数据库服务器(Server) 数据库服务器是一种用来存储、管理和查询大量数据的服务器。它是一个独立的计算机系统&#xff0c;运行数据库管理系统&#xff08;DBMS&#xff09;软件&#xff0c;并提供对数据库的访问…

【ECMAScript笔记二】运算符分类,流程控制(顺序结构、分支结构、循环结构)

文章目录 4 运算符4.1 算术运算符4.2 递增和递减运算符4.3 比较运算符4.4 逻辑运算符4.5 赋值运算符4.6 运算优先级 5 流程控制5.1 顺序结构5.2 分支结构5.2.1 if 语句5.2.2 switch 语句 5.3 循环结构5.3.1 for循环5.3.2 while循环5.3.3 do while循环5.3.4 continue和break 5.4…

数据科学知识库

​ 我的博客是一个技术分享平台&#xff0c;涵盖了机器学习、数据可视化、大数据分析、数学统计学、推荐算法、Linux命令及环境搭建&#xff0c;以及Kafka、Flask、FastAPI、Docker等组件的使用教程。 在这个信息时代&#xff0c;数据已经成为了一种新的资源&#xff0c;而机…

1.新入手的32位单片机资源和资料总览

前言&#xff1a; 学了将近1年的linux驱动和uboot&#xff0c;感觉反馈不足&#xff0c;主要是一直在学各种框架&#xff0c;而且也遇到了门槛&#xff0c;比如驱动部分&#xff0c;还不能随心所欲地编程&#xff0c;原因是有些外设的原理还不够深刻、有些复杂的底层驱动的代码…

java springboot 内存级数据库 H2 创建表并添加数据演示

好 上文 java简述springboot通过配合初始化H2数据库并完成登录 带着大家登进了 h2数据库 这里需要强调 你只需要第一次加上 datasource:url: jdbc:h2:~/testhikari:driver-class-name: org.h2.Driverusername: rootpassword: 123456这些 因为它要初始化 你后面再启动 去掉这些…

C语言预处理详解及其指令

预处理详解 1.预定义符号2.#define定义常量基本使用方法举例子如果在define定义的表示符后面加上分号会发生什么&#xff1f;用一下来解释 3. #define定义宏举例例1例2 4. 带有副作用的宏参数例如: 5. 宏替换的规则6. 宏函数的对比宏和函数的一个对比 7. #和##7.1 #运算符7.2 #…

shell子进程管理

简介 在我们平时写代码过程中&#xff0c;可能经常会遇到串行执行速度慢 &#xff0c;串行无法执行多个任务&#xff0c;这时便需要使用子进程同时执行。使用父进程创建子进程时&#xff0c;子进程会复制父进程的内存、文件描述符和其他相关信息。当然&#xff0c;子进程可以独…

2023年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 1、大会背景与概述 全球运维大会&#xff08;GOPS&#xff09;是运维领域最具影响力的国际盛会&#xff0c;每年都会汇聚世界各地的运维专家、企业领袖、技术爱好者&#xff0c;共同探讨运维技术的最新发展、最佳实践以及面临的挑战。2023年GOPS深圳站作为该系列…

亚马逊云科技re:Invent推出生成式AI技术堆栈及关键服务和工具

亚马逊云科技于29日推出“生成式AI技术堆栈”后&#xff0c;又在30日的re:Invent 2023大会上宣布了一系列支持这一全新堆栈的关键服务和工具。 亚马逊云科技数据和人工智能副总裁Swami Sivasubramanian在主题演讲中&#xff0c;将生成式人工智能与“超新星爆炸”进行了比较&am…

HttpRunner接口自动化测试框架

简介 HttpRunner是一款面向 HTTP(S) 协议的通用测试框架&#xff0c;只需编写维护一份 YAML/JSON 脚本&#xff0c;即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。 项目地址&#xff1a;GitHub - httprunner/httprunner: HttpRunner 是一个开源的 API/UI…