网络 / day02 作业

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.mfbz.cn/a/252653.html

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

相关文章

CCF-CSP真题《202312-1 仓库规划》思路+python,c++,java满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202312-1试题名称&#xff1a;仓库规划时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛上共有 n 个仓库&#xff0c;依次编…

模块一——双指针:LCR 179.查找总价格为目标值的两个商品

文章目录 题目描述算法原理解法一&#xff1a;暴力解法(会超时&#xff09;解法二&#xff1a;对撞指针 代码实现解法一&#xff1a;暴力解法(超时&#xff09;解法二&#xff1a;对撞指针(时间复杂度为O(N)&#xff0c;空间复杂度为O(1)) 题目描述 题目链接&#xff1a;LCR 1…

C语言-Makefile

Makefile 什么是make&#xff1f; make 是个命令&#xff0c;是个可执行程序&#xff0c;用来解析 Makefile 文件的命令这个命令存放在 /usr/bin/ 什么是 makefile? makefile 是个文件&#xff0c;这个文件中描述了我们程序的编译规则咱们执行 make 命令的时候&#xff0c; m…

【Linux】在vim中批量注释与批量取消注释

在vim编辑器中&#xff0c;批量注释和取消注释的操作可以通过进入V-BLOCK模式、选择要注释或取消注释的内容、输入注释符号或选中已有的注释符号和按键完成。这些操作可以大大提高代码或文本的编写和修改效率&#xff0c;是vim编辑器中常用的操作之一。 1.在vim中批量注释的步…

Ubuntu22.04添加用户

一、查看已存在的用户 cat /etc/passwd 二、添加用户 sudo adduser xxx 除了密码是必须的&#xff0c;其他的都可以不填&#xff0c;直接回车即可 三、查看添加的用户 cat /etc/passwd 四、将新用户添加到sudo组 sudo adduser xxx sudo 五、删除用户 sudo delus…

线上业务优化之案例实战

本文是我从业多年开发生涯中针对线上业务的处理经验总结而来&#xff0c;这些业务或多或少相信大家都遇到过&#xff0c;因此在这里分享给大家&#xff0c;大家也可以看看是不是遇到过类似场景。本文大纲如下&#xff0c; 后台上传文件 线上后台项目有一个消息推送的功能&#…

Windows11安装python模块transformers报错Long Path处理

Windows11安装python模块transformers报错&#xff0c;报错信息如下 ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: C:\\Users\\27467\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\Local…

四. 基于环视Camera的BEV感知算法-BEVDet

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

Spring IoCDI

文章目录 一、Spring、Spring boot、Spring MVC之间的区别1. Spring 是什么2. 区别概述 一、Spring、Spring boot、Spring MVC之间的区别 1. Spring 是什么 Spring 是包含了众多工具方法的 IoC 容器 &#xff08;1&#xff09;容器 容器是用来容纳某种物品的基本装置&#xf…

DevEco Studio无法识别本地模拟器设备的解决方法

遇到了一个问题&#xff0c;之前测试无误的本地模拟器&#xff0c;运行后设备栏中无法识别了。 此时保持模拟器处于开启状态&#xff0c;关闭DevEco Studio窗口重新启动后&#xff0c;发现重新识别设备了。

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

c语言中的static静态(1)static修饰局部变量

#include<stdio.h> void test() {static int i 1;i;printf("%d ", i); } int main() {int j 0;while (j < 5){test();j j 1;}return 0; } 在上面的代码中&#xff0c;static修饰局部变量。 当用static定义一个局部变量后&#xff0c;这时局部变量就是…

【TB作品】51单片机,具有报时报温功能的电子钟

2.具有报时报温功能的电子钟 一、功能要求: 1.显示室温。 2.具有实时时间显示。 3.具有实时年月日显示和校对功能。 4.具有整点语音播报时间和温度功能。 5.定闹功能,闹钟音乐可选。 6.操作简单、界面友好。 二、设计建议: 1.单片机自选(C51、STM32或其他单片机)。 2.时钟日历芯…

L1-047:装睡

题目描述 你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏&#xff0c;你可以发现谁在装睡&#xff01;医生告诉我们&#xff0c;正常人睡眠时的呼吸频率是每分钟15-20次&#xff0c;脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏&#xff0c;请你…

智能优化算法应用:基于松鼠算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于松鼠算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于松鼠算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.松鼠算法4.实验参数设定5.算法结果6.参考文献7.MA…

qt实现基本文件操作

先通过ui界面实现基本框架 接下来就要实现每个按键的功能了 我们先来实现新建的的功能&#xff0c;我们右键新建键&#xff0c;可以发现没有转到槽的功能&#xff0c;因此我们要自己写connect来建立关系。 private slots:void newActionSlot(); 在.h文件中加上槽函数。 conne…

PMP项目管理 - 风险管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

常见Appium相关问题及解决方案

问题1&#xff1a;adb检测不到设备 解决&#xff1a; 1.检查手机驱动是否安装&#xff08;win10系统不需要&#xff09;&#xff0c;去官网下载手机驱动或者电脑下载手机助手来辅助安装手机驱动&#xff0c;安装完成后卸载手机助手&#xff08;防止接入手机时抢adb端口造成干…

【教3妹学编程-算法题】找到 Alice 和 Bob 可以相遇的建筑

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2…

SpringBoot 源码解析2:启动流程1

SpringBoot 源码解析2&#xff1a;启动流程1 1.启动方式2.SpringBootApplication3.SpringApplication3.1 构造器SpringApplication3.2 SpringApplication#run 3.3 SpringApplication#run 中关键方法3.1 SpringApplication#prepareEnvironment3.2 SpringApplication#prepareCont…
最新文章