嵌入式学习-网络编程-Day3

news2024/11/15 4:24:19

思维导图

Day3.png

多进程并发服务器通信模型如下

void handler(int signo)
{
    while(waitpid()>0);      //以非阻塞配合信号完成僵尸进程的回收
}
int  main()
{
    //将信号与信号处理函数绑定
    signal(SIGCHLD, handler);
 
    socket();    //创建用于连接的套接字
    bind();           //绑定IP地址和端口号
    listen();           //将套接字设置成被动监听状态
     while(1)
     {
         newfd = accept();           //接收客户端连接请求
         fd = fork();           //创建子进程用于通信
         if(pid > 0)
         {
             //父进程中关闭newfd
             close(newfd);         
         } else if(pid == 0)
         {
             close(sfd);          //关闭sfd
             //子进程用于通信
             recv();
             send();
             close(newfd);       
             exit(EXIT_SUCCESS);     //退出子进程  
         }             
     }    
      close(sfd);   关闭监听 
}

多线程实现TCP并发服务器的通信模型如下

socket();         //创建套接字
bind();             //必须绑定
listen();            //设置被动监听
while(1)
{
    newfd = accept();            //接收客户端连接请求
    //创建分支线程,用于跟客户端进行交互
    pthread_create(&tid, NULL, deal_cli_msg, &info);
    
    //线程分离
    pthread_detach(tid);
}
//线程处理函数的定义
void *deal_cli_msg(void *arg)
{
    recv();
    send();
    close();
    pthread_exit();
}

作业:编写一个客户端,通过TFTP服务器实现文件的上传和下载

部分代码如下

#include<myhead.h>
#define SER_PORT 69
#define SER_IP "192.168.122.71"

int do_download(int cfd,struct sockaddr_in sin)
{
    //向服务器发送下载请求
    char buf[516] = "";
	 //组装请求数据
    short *p1 = (short *)buf;
    *p1 = htons(1);
    
    char *p2 = buf+2;
    char filename[24]="";
    printf("请输入要下载的文件名>>>");
    scanf("%s",filename);
    getchar();
    strcpy(p2, filename);

    char *p3 = p2+strlen(p2)+1;
    strcpy(p3, "octet");

    int len = 4+strlen(p2) + strlen(p3);   //要发送的长度

    //向服务器发送请求
    sendto(cfd, buf, len, 0, (struct sockaddr*)&sin, sizeof(sin));
    printf("下载请求已发送\n");
    
    int fd = -1;
    int res=0;
    //循环收发 
    while(1)
    {
        //客户端收取数据包
        bzero(buf,sizeof(buf));
        if(res=recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL)==-1)
        {
            perror("recv error");
            break;
        }
        
        short *opera_id=(short *)buf; //操作码
        short bid;  //块编号
        if(*opera_id==3)
        {
            *opera_id=4;
            //块编号
            short *pbid=(short*)buf+2;
            bid=(short)(*pbid);

            //数据
            char *pdata=(char*)pbid+2;
            int datalen = strlen(pdata);
            if((*pbid)==1)
            {
                if(fd=open(filename,O_WRONLY|O_CREAT|O_APPEND,0664)==-1)
                {
                    perror("open error");
                    return -1;
                }
            }

            if(write(fd,pdata,res-4)==-1)
            {
                perror("write all");
                break;
            }

            //ACK
            //发送ACK包
            sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin));
            if(res <516 )
            {
                puts("下载完成");
                break;
            }
        }
    }
    puts("下载完成");
    close(fd);
    return 0;
}

int do_upload(int cfd,struct sockaddr_in sin)
{


}

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

    //2、绑定(可选)
    
    //3、填充服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);

    char menu;

	//制作菜单框架
	while(1)
	{
		printf("\t\t====1.download====\n");
		printf("\t\t====2.upload====\n");
		printf("\t\t====0.exit====\n");
		
		printf("Please enter function options:");
		scanf("%c",&menu);
		while(getchar() != '\n');

		//对菜单选项多分支选择
		switch(menu)
		{
			case '1':    
				{
					do_download(cfd,sin);  //下载
				}
				break;
			case '2':
				{
					do_upload(cfd,sin);     //上传
				}
				break;
			case '0':
					exit(1);
			default:
				{
					printf("enter error!!!");
				}
		}
		printf("Enter any key to clear the screen:");
		while(getchar() != '\n');
		system("clear");
	}
    //5、关闭套接字
    close(cfd);


    return 0;
}

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

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

相关文章

Python和Java代码实现:切线法求解一维最优化问题

Python和Java代码实现&#xff1a;切线法求解一维最优化问题 代码实现Python代码Java代码 求解实例 根据概念查询&#xff0c;切线法定义如下&#xff1a; 切线法&#xff08;Tangent Method&#xff09;是一种用于求解非线性方程的数值方法。它也被称为牛顿法&#xff08;Newt…

C++ 程序文档生成器(doxygen)使用说明

程序文档&#xff0c;是每个程序员必看文档&#xff0c;在日常业务开发中&#xff0c;难免会封装一些组件。没有很好的组件文档&#xff0c;再好的组件都是废物&#xff0c;。因此大型业务中&#xff0c;文档和思维导图&#xff0c;两个都是必备&#xff01; 一、注释风格 …

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

各种设备上恢复已删除的文件和文件夹的数据恢复软件清单

最好的数据恢复软件可以简单轻松地恢复计算机、移动设备或存储介质上已删除的文件和文件夹。 询问任何经历过数据丢失的人这是否是一种有趣的经历&#xff0c;他们会告诉您数据丢失&#xff0c;无论是由于硬件或软件故障、意外删除还是网络犯罪&#xff0c;都会带来极大的压力…

美国 SEC 批准比特币现货 ETF 上市,SEC 告诉我们的风险包含哪些?

撰文&#xff1a;Will 阿望 查看原文&#xff1a;美国 SEC 批准比特币现货 ETF 上市&#xff0c;SEC 告诉我们的风险包含哪些&#xff1f; 历经十年的 BTC ETF 艰辛审批之路终于迎来了胜利的曙光&#xff0c;2024 年 1 月 11 日凌晨 4 时&#xff0c;美国证监会&#xff08;S…

AIGC实战——像素卷积神经网络(PixelCNN)

AIGC实战——像素卷积神经网络 0. 前言1. PixelCNN 工作原理1.1 掩码卷积层 1.2 残差块2. 训练 PixelCNN3. PixelCNN 分析4. 使用混合分布改进 PixelCNN小结系列链接 0. 前言 像素卷积神经网络 (Pixel Convolutional Neural Network, PixelCNN) 是于 2016 年提出的一种图像生成…

礼贺新春,徐坊大曲新品【中国红】

梁山徐坊大曲新推出中国风礼盒&#xff0c;以中国红为主题&#xff0c;为即将到来的新春佳节增添了浓厚的节日气氛。为您呈现一场视觉与味觉的盛宴。从礼盒的颜色到图案设计&#xff0c;无不体现出中国红的热情与活力&#xff0c;象征着吉祥、喜庆与团圆。梁山徐坊大曲&#xf…

ubuntu qt 运行命令行

文章目录 1.C实现2.python实现 1.C实现 下面是封装好的C头文件&#xff0c;直接调用run_cmd_fun()即可。 #ifndef GET_CMD_H #define GET_CMD_H#endif // GET_CMD_H #include <iostream> #include<QString> using namespace std;//system("gnome-terminal -…

USB8814动态信号采集卡——声音振动类信号处理的理想之选!

背景介绍&#xff1a; 科技的发展在一定程度上依赖于对信号的处理&#xff0c;信号处理技术的先进性在很大程度上决定了科技发展的速度和方向。数字信号处理技术的崛起&#xff0c;彻底改变了传统的信息与信号处理方式&#xff0c;使得数据采集这一前期工作在数字系统中发挥着…

FTP文件传输协议 、多种方式安装yum仓库

一、网络文件共享服务 1.存储类型分三种&#xff1a; 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储…

ImageNet Classification with Deep Convolutional 论文笔记

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…

SpringMVC参数接收见解4

# 4.参数接收Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换…

第二证券:大盘探底回升走出底部还看成交量配合

持续震动数日后&#xff0c;大盘再现探底上升走势。 上证指数周二小幅低开后窄幅震动&#xff0c;午后快速回落改写本轮回调新低后&#xff0c;有资金开始出手介入&#xff0c;尾盘指数翻红。深证成指同样是在午后呈现探底上升走势&#xff0c;最终重回5日均线上方。截至收盘&…

mysql 下载和安装和修改MYSQL8.0 数据库存储文件的路径

一、第一步:下载步骤 下载链接&#xff1a;MySQL :: Download MySQL Installer 选择版本8.0.35&#xff0c;社区版&#xff0c; 点击 Download 下载 安装包 二、第二步:安装步骤 添加环境变量&#xff0c;C:\Program Files\MySQL\MySQL Server 8.0\bin 可以点开MySQL 8.0 Co…

如何用AI提高论文阅读效率?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…

HNU-模式识别-作业2-面向应用分类系统

模式识别-作业2 计科210X 甘晴void 202108010XXX 【具体实现思路是按照去年数学建模国赛题来做的&#xff0c;就放个思路&#xff0c;完整不放全了】 题目&#xff1a; 查阅文献资料&#xff0c;构建一个面向应用的分类系统。 要求&#xff1a; 至少3页A4纸&#xff0c;文…

机器人制作开源方案 | AI校园服务机器人

作者&#xff1a;李强、李振宁、毛维雷、李文文、张奥 单位&#xff1a;山西能源学院 指导老师&#xff1a;姚志广、程晟 在这个科技飞速发展的时代&#xff0c;在工业智造、人工智能的飞速发展中&#xff0c;出现了越来越多的智能化机械装置&#xff0c;也有许多创新类的比赛…

STM32F103标准外设库—— 新建工程与库函数(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

力扣刷MySQL-第二弹(详细解析)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…