5.17 作业+思维导图+模拟面试

news2024/11/20 20:34:08
// tcp_ser.c
#include <myheader.h>

#define SER_PORT 8888
#define SER_IP "192.168.125.109"

int newfd, sfd;

int main(int argc, const char *argv[])
{
	//1、为通信创建一个端点
	sfd = socket(AF_INET, SOCK_STREAM, 0);
	//参数1:说明使用的是ipv4通信域
	//参数2:说明使用的是tcp面向连接的通信方式
	//参数3:由于参数2中已经指定通信方式,填0
	if(-1 == sfd){
		perror("socket");
		return 1;
	}
	printf("socket success sfd = %d\n", sfd);

	//2、绑定ip和端口号
	//2.1、准备地址信息结构体
	struct sockaddr_in sin = {
		.sin_family = AF_INET,//通信域
		.sin_port = htons(SER_PORT),//端口号
		.sin_addr = { inet_addr(SER_IP) },//ip地址
	};

	//2.2、绑定工作
	if(-1 == bind(sfd, (struct sockaddr*)&sin, sizeof(sin))){
		perror("bind");
		return 1;
	}
	puts("bind success");

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

	//4、阻塞等待客户端的连接
	//4.1、定义用于接受客户端信息的容器
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
	if(-1 == newfd){
		perror("accpet");
		return 1;
	}
	printf("[%s:%d]:connected!\n", inet_ntoa(cin.sin_addr),
			ntohs(cin.sin_port));

	//5、与客户端进行相互通信
	while(1){
		char rbuf[128] = {};// 读取消息内容的容器
		//从套接字中读取数据
		int res = recv(newfd, rbuf, sizeof(rbuf), 0);
		if(0 == res){
		  	puts("client disconnecting...");
		  	break;
		  }
		//将读取的消息展示出来
		printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr),
				ntohs(cin.sin_port), rbuf);
		//将消息处理并回复客户端
		strcat(rbuf, "---> OK");
		//将消息发送给客户端
		send(newfd, rbuf, strlen(rbuf), 0);
		puts("send over");
	}
//6、关闭套接字
	close(newfd);
	close(sfd);
	return 0;
}
// tcp_cli.c

#include <myheader.h>
#define SER_PORT 8888
#define SER_IP "192.168.125.109"
#define CLI_PORT 6666
#define CLI_IP "192.168.125.109"

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

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

	//3、连接服务器
	//3.1、准备对端地址信息结构体
	struct sockaddr_in sin = {
		.sin_family = AF_INET,
		.sin_port = htons(SER_PORT),
		.sin_addr = { .s_addr = inet_addr(SER_IP) },
	};	
	//3.2、连接服务器
	if(-1 == connect(cfd, (struct sockaddr*)&sin, sizeof(sin))){
		perror("connect");
		return 1;
	}
	puts("connect success");

	//4、数据收发
	while(1){
		char buf[128] = {};
		//从终端上获取要发送的数据
		fgets(buf, sizeof(buf), stdin);
		buf[strlen(buf) - 1] = '\0';
		//将数据发送给服务器
		send(cfd, buf, strlen(buf), 0);
		puts("send over");
		
		bzero(buf, sizeof(buf));
		//接收服务器发来的信息
		recv(cfd, buf, sizeof(buf), 0);
		puts(buf);
	}
	close(cfd);

	return 0;
}
//udp_ser.c
#include <myheader.h>                                                        

#define SER_PORT 8888
#define SER_IP "192.168.125.109"


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

    //2、绑定IP地址和端口号
    //2.1、填充地址信息结构体
    struct sockaddr_in sin = {
        .sin_family = AF_INET,
        .sin_port = htons(SER_PORT),
        .sin_addr = { inet_addr(SER_IP) },
    };

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

    //3、数据收发
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);
    while(1){
        //清空容器
        char buf[128] = {};
        recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);
        printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),
                buf);
        //将接受到的数据添加OK回复回去
        strcat(buf, "---> OK");
        if(-1 == sendto(sfd, buf, strlen(buf), 0, (struct sockaddr*)&cin,
                    sizeof(cin))){
            perror("write");
            return 1;
        }
        puts("send ok");
    }


    return 0;
}
//udp_cli.c
#include <myheader.h>

#define SER_PORT 8888
#define SER_IP "192.168.125.109"
#define CLI_PORT 9999
#define CLI_IP "192.168.125.109"

int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字文件描述符
    int cfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == cfd){
        perror("socket");
        return 1;
    }
    printf("cfd = %d\n", cfd);
    /*//2、绑定IP地址和端口号
    //2.1、填充地址信息结构体
    
    struct sockaddr_in cin = {
        .sin_family = AF_INET,
        .sin_port = htons(CLI_PORT),
        .sin_addr = { inet_addr(CLI_IP) },
    };
    if(-1 == bind(cfd, (struct sockaddr*)&cin, sizeof(cin))){
        perror("bind");
        return 1;
    }
    puts("bind success");

    */

    //3、数据收发
    //填充服务器的地址信息结构体
    struct sockaddr_in sin = {
        .sin_family = AF_INET,
        .sin_port = htons(SER_PORT),
        .sin_addr = { inet_addr(SER_IP) },
    };
    while(1){
        //清空容器
        char buf[128] = {};
        //从终端上获取信息
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = '\0';
        //将消息发送给服务器
        int ret = sendto(cfd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin));
        printf("ret = %d\n", ret);
        puts("send over");
        //接受服务器发来的消息
        recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);
        puts(buf);
    }
    //4、关闭套接字
    close(cfd);                                                                         
    return 0;
}

 

  1. IP地址由网络号与主机号组成,用于标识一个计算机在网络中的位置
  2. 根据前缀的长度不同,划分为A、B、C、D、E五类IP地址
    1. A类,前缀0,8位网络号,24位主机号,表示范围1.0.0.0 ~ 127.255.255.255,被保留,不再供给,但少数大型公司拥有
    2. B类,前缀10,16位网络号,16位主机号,表示范围128.0.0.0 ~ 191.255.255.255,网络运营商拥有
    3. C类,前缀110,24位网络号,8位主机号,表示范围192.0.0.0 ~ 223.255.255.255,家庭网,校园网,企业网
    4. D类,前缀1110,全为网络号,表示范围224.0.0.0 ~ 239.255.255.255,组播IP
    5. E类,前缀1111,全为网络号,表示范围240.0.0.0 ~ 255.255.255.255,保留及实验室使用
  3. 200.0.0.1属于C类地址
  4. 端口号是2字节的无符号整数,标识了网络通信中的单个主机中的进程,借用端口号可以使得数据交付给正确的进程
  5. 字节序就是字节的序列,在通过网络通信时,发送接收的多字节整型数据需要考虑主机字节序与网络字节序的相互转换,由于不同计算机使用的架构、CPU处理方式不同,可能存在大小端存储,但是网络上一定是大端存储,可以使用转换函数实现转换
  6. 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
  7. http、tftp应用层,ip网络层,udp传输层,arp数据链路层
  8. TCP:面向连接的、可靠的、有差错和拥塞控制的传输协议,传输的数据不错误、不重复、不丢失、不失序,存在粘包现象,即将相邻多个较小且发送间隔短的数据,则粘成一个包传输,由于需要应答和重传,效率较低,数据收发不同步,使用场景是要求传输质量高或大量数据传输时,比如用户登录和大型文件下载等。UDP:无连接的、不可靠的、尽最大努力交付的传输协议,传输的数据可能会重复,丢失,失序,若单次数据量超过上限则直接删除,收发同步,使用场景发送小尺寸数据或接收数据应答困难的情况,比如广播、音视频通话等。
  9. TCP服务端创建流程
    1. 创建socket套接字,获取套接字文件描述符
    2. bind绑定ip地址及端口号
    3. listen设置监听状态
    4. accept接收客户端连接请求,返回用于读写的描述符,获取客户端ip及端口
    5. 读写数据:send、recv
    6. close关闭套接字描述符和读写描述符
  10. UDP服务端创建流程
    1. 创建socket套接字,获取套接字文件描述符
    2. bind绑定ip地址及端口号
    3. 读写数据:sendto、recvfrom
    4. close关闭套接字

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

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

相关文章

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch&#xff0c;没有遇到什么问题。今天在现有JDK上安装&#xff0c;遇到的问题记录一下&#xff1a; 1. JDK的环境变量配置与我原有的不一致报如下错误&#xff1a; [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

论文精读-SwinIR Image Restoration Using Swin Transformer

论文精读-SwinIR: Image Restoration Using Swin Transformer SwinIR:使用 Swin Transformer进行图像恢复 参数量&#xff1a;SR 11.8M、JPEG压缩伪影 11.5M、去噪 12.0M 优点&#xff1a;1、提出了新的网络结构。它采用分块设计。包括浅层特征提取&#xff1a;cnn提取&#…

旧书回收小程序开发:让每一本书都拥有第二次生命

一、引言 在知识的海洋中&#xff0c;每一本书都是一座孤岛&#xff0c;等待着被发现和珍视。然而&#xff0c;随着时代的变迁&#xff0c;许多旧书被遗忘在角落&#xff0c;失去了应有的光芒。为了让这些旧书重新焕发生机&#xff0c;我们决定开发一款旧书回收小程序&#xf…

力扣654. 最大二叉树

Problem: 654. 最大二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 对于构造二叉树这类问题一般都是利用先、中、后序遍历&#xff0c;再将原始问题分解得出结果 1.定义递归函数build&#xff0c;每次将一个数组中的最大值作为当前子树的根节点构造二叉树&#xff1b;…

【JavaScript】初识 Promise

出现原由 先看一个例子&#xff1a; 模拟发送表白信息&#xff0c;如果一个失败&#xff0c;那么再给其他人发送&#xff0c;这时就相当于在失败回调函数中套了一层回调&#xff1b;如果后续还有多个表白对象&#xff0c;那么将一层一层地嵌套下去&#xff0c;也就是回调地狱…

前端vue 动态加载ts文件,动态调用ts内的方法

业务场景: 在某个业务场景中, 我们需要在数据库配置ts文件路径,和需要调用的函数名称, 前端需要再指定的场景下,触发对应的函数, 并执行处理逻辑,返回结果. 实现: 这是一个数据库配置生成的动态表单 动态校验的例子, 需要引用动态的函数校验 任意一个js文件, common1.ts c…

在校大学生 40 天斩获云计算 HCIE 3.0 证书,赢在起跑线!

我是一名来自武汉职业技术学院的学生&#xff0c;于3月初开启备考之旅&#xff0c;在4月15日参加了考试&#xff0c;17日便接到了云计算HCIE 3.0考试通过的消息&#xff0c;内心甚是欢喜。首先&#xff0c;我要特别感谢誉天的两位实验老师给予的辅导&#xff1b;其次&#xff0…

盲人社区生活支持体系:织就一张温暖的网

在当今社会&#xff0c;构建一个全面、包容的盲人社区生活支持体系成为了推动社会进步、保障残障人士权益的重要议题。随着科技的不断革新&#xff0c;一款名为“蝙蝠避障”的辅助软件走进了盲人的日常生活&#xff0c;它如同一位无形的向导&#xff0c;通过实时避障与拍照识别…

探索python列表处理:偶数筛选的两种方法

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、不使用列表生成式的偶数筛选 1. 读取输入列表 2. 筛选偶数 三、使用列表生…

智能界面设计:数字孪生与大数据结合的美学典范

智能界面设计&#xff1a;数字孪生与大数据结合的美学典范 引言 在数字化浪潮的推动下&#xff0c;智能界面设计成为了连接用户与技术的重要桥梁。数字孪生技术与大数据的结合&#xff0c;不仅为UI设计带来了前所未有的创新机遇&#xff0c;更成为了美学与功能性融合的典范。…

linux命令中arpd的使用

arpd 收集免费ARP信息 补充说明 arpd命令 是用来收集免费arp信息的一个守护进程&#xff0c;它将收集到的信息保存在磁盘上或者在需要时&#xff0c;提供给内核用户用于避免多余广播。 语法 arpd(选项)(参数)选项 -l&#xff1a;将arp数据库输出到标准输出设备显示并退出…

如何快速复现NEJM文章亚组分析森林图?

现在亚组分析好像越来越流行&#xff0c;无论是观察性研究还是RCT研究&#xff0c;亚组分析一般配备森林图。 比如下方NEJM这张图&#xff0c;配色布局都比较经典美观&#xff01; 但是在使用R语言绘制时&#xff0c;想要绘制出同款森林图&#xff0c;少不了复杂参数进行美化调…

【Mac】跑猫RunCat for mac(菜单栏Cpu可视化监测工具) v10.3免费版安装教程

软件介绍 RunCat是一款为菜单栏提供关键帧动画的软件。动画速度会根据Mac的CPU使用情况而变化。奔跑的小猫通过运行速度告诉您Mac的CPU使用率。 这是一款好玩的软件&#xff0c;可以为您的Mac使用添加一点小确幸。感兴趣的朋友可以试试哦。 安装步骤 1.打开安装包&#xff0…

全球最高点赞记录,世界点赞第一名是谁?世界点赞第一人名字的由来

世界点赞第一人名字的由来&#xff1a; 起源与概念提出&#xff1a; 二十一世纪东方伟大的思想家哲学家教育家颜廷利教授&#xff0c;一位在中国21世纪早期便以其非凡才华和创新精神著称的学者&#xff0c;早在互联网尚未普及的20世纪90年代&#xff0c;就已经提出了“点赞”的…

python抽取pdf中的参考文献

想将一份 pdf 论文中的所有参考文献都提取出来&#xff0c;去掉不必要的换行&#xff0c;放入一个 text 文件&#xff0c;方便复制。其引用是 ieee 格式的&#xff0c;形如&#xff1a; 想要只在引用序号&#xff08;如 [3]&#xff09;前换行&#xff0c;其它换行都去掉&…

XH连接器>KH-XH-5A-Z

品  牌&#xff1a; kinghelm(金航标) 厂家型号&#xff1a; KH-XH-5A-Z 封装&#xff1a; 插件,P2.5mm 商品毛重&#xff1a; 0.429克(g) 包装方式&#xff1a; 袋装

Docker(四)容器相关操作及问题处理

目录 一、进入、退出容器操作 二、查看Docker 容器的配置文件 方法一&#xff1a;进入docker容器内进行查看 方法二&#xff1a;通过数据卷挂载方式查看配置文件 方法三&#xff1a;使用Docker可视化工具查看配置文件 三、容器与宿主机时间同步 方法一&#xff1a;创建启…

Windows 7 SP1 安装VMtools -- 安装失败的解决方法

VMware安装Win7 SP1可以参考这篇文章&#xff1a;https://blog.csdn.net/2301_77225571/article/details/139121179?spm1001.2014.3001.5501 1.下载补丁 https://www.catalog.update.microsoft.com/search.aspx?qkb4474419 2.本机远控Win7 【Win】【R】&#xff0c;输入cmd…

同旺科技 FLUKE ADPT 隔离版发布 ---- 3

所需设备&#xff1a; 1、FLUKE ADPT 隔离版 内附链接&#xff1b; 应用于&#xff1a;福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于&#xff1a;福禄克Fluke 15B / 17B / 18B 总体连接&#xff1a; 连接线&#xff0c;根据自己实际需求而定&#xff1b; …