网络编程day4作业

 下载和上传功能:

#include<myhead.h>

//实现下载功能
int do_download(int cfd, struct sockaddr_in sin)
{
    //定义变量存储下载请求包
    char buf[516] = "";
    //定义变量存储文件名
    char fileName[40] = "";

    printf("请输入文件名:");
    scanf("%s", fileName);
    getchar();

    //组装请求包
    short *p1 = (short *)buf;
    *p1 = htons(1);                 //表明要下载

    char *p2 = buf+2;           //文件名段
    strcpy(p2, fileName);

    char *p4 = p2+strlen(p2)+1;    //模式段
    strcpy(p4, "octet");

    int size = 4 + strlen(p2) + strlen(p4);      //要发送数据的大小
    
    //向服务器发送下载请求
    if(sendto(cfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("sendto error");
        return -1;
    }

    printf("请求成功\n");
/*********************************************/
    //循环接收回复服务器发来的消息
	//绑定客户端信息
/*	
	struct sockaddr_in cin1;
    cin1.sin_family = AF_INET;
    cin1.sin_port = htons(7788);
    cin1.sin_addr.s_addr = inet_addr("192.168.125.130");

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

	
	//定义临时地址结构体
	struct sockaddr_in sin1;
	/*
    sin1.sin_family = AF_INET;
    sin1.sin_port = htons(12345);
    sin1.sin_addr.s_addr = sin.sin_addr.s_addr;
	*/
	//创建文件
    int wfd = -1;
	if((wfd = open(fileName,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
	{
		perror("open");
		return -1;
	}


	int res = -1;
	while(1)
	{
		bzero(buf,sizeof(buf));
		socklen_t socklen = sizeof(sin1);
		res = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin1,&socklen);
		if(buf[1] == 3)
		{
			write(wfd,buf+4,res-4);
		}
		if(res < 516)
		{
			printf("传输完成\n");
			break;
		}
		//返回一个ACK
		buf[1]=4;
		sendto(cfd,buf,4,0,(struct sockaddr*)&sin1,sizeof(sin1));

	}

}
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
//实现上传功能
int do_upload(int cfd, struct sockaddr_in sin)
{
    //定义变量存储上传请求包
    char buf[516] = "";
    //定义变量存储文件名
    char fileName[40] = "";

    printf("请输入文件名:");
    scanf("%s", fileName);
    getchar();

    //组装请求包
    short *p1 = (short *)buf;
    *p1 = htons(2);                 //表明要上传

    char *p2 = buf+2;           //文件名段
    strcpy(p2, fileName);

    char *p4 = p2+strlen(p2)+1;    //模式段
    strcpy(p4, "octet");

    int size = 4 + strlen(p2) + strlen(p4);      //要发送数据的大小
    
    //向服务器发送上传请求
    if(sendto(cfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("sendto error");
        return -1;
    }

    printf("请求成功\n");
/*********************************************/
    //循环接收回复服务器发来的消息
	//绑定客户端信息
/*	
	struct sockaddr_in cin1;
    cin1.sin_family = AF_INET;
    cin1.sin_port = htons(7788);
    cin1.sin_addr.s_addr = inet_addr("192.168.125.130");

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

	
	//定义临时地址结构体
	struct sockaddr_in sin1;
	/*
    sin1.sin_family = AF_INET;
    sin1.sin_port = htons(12345);
    sin1.sin_addr.s_addr = sin.sin_addr.s_addr;
*/	
	//创建文件
    int wfd = -1;
	if((wfd = open(fileName,O_RDONLY)) == -1)
	{
		perror("open");
		return -1;
	}


	int res = -1;
	int count = 1;
	while(1)
	{
		//接受服务器返回来的ACK
		bzero(buf,sizeof(buf));
		socklen_t socklen = sizeof(sin1);
		recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin1,&socklen);
		//判断是否为ACK
		if(buf[1] == 4)
		{
			//组装有个数据包发送个服务器
			buf[1] = 3;
			buf[3] = count++;
			res = read(wfd,buf+4,sizeof(buf)-4);

			sendto(cfd,buf,res+4,0,(struct sockaddr*)&sin1,sizeof(sin1));

			if(res < 512)
			{
				printf("上传完成\n");
				break;
			}
		}
	}
}








int main(int argc, const char *argv[])
{
    if(argc != 2)
    {
        printf("input error\n");
        printf("usage:./a.out ip\n");
        return -1;
    }

    //1、创建套接字
    int cfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(cfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、填充服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(69);
    sin.sin_addr.s_addr = inet_addr(argv[1]);

    int mune = -1;
    while(1)
    {
        system("clear");                     //清屏
        printf("\t\t======1、下载=======\n");
        printf("\t\t======2、上传=======\n");
        printf("\t\t======0、退出=======\n");

        printf("请输入功能:");
        scanf("%d", &mune);
        getchar();

        //多分支选择
        switch(mune)
        {
        case 1:
            {
                do_download(cfd, sin);
            }
            break;

        case 2:
            {
                do_upload(cfd,sin);
            }
            break;
        case 0:
            goto POS;
        default:printf("输入功能有误,请重新输入\n");
        }

        //阻塞
        printf("输入任意键,按回车清空:");
        while(getchar() != '\n');

    }

POS:
    //关闭套接字
    close(cfd);


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《day03-手动组建fabric网络.pdf》是一份指导手册,用于教授如何手动组建Fabric网络。Fabric网络是一个分布式账本技术,可用于构建区块链解决方案。这个手册详细介绍了在组建Fabric网络时的步骤和注意事项。 首先,手动组建一个Fabric网络需要一些技术基础。手册在开始部分介绍了一些必备的知识,例如区块链和分布式账本的基本概念。学习者需要理解这些基础概念,以便更好地理解后续的内容。 手册还提供了一些实践操作的步骤。首先,需要准备网络中的各个组件,例如Peer节点、Orderer节点和Channel。手册详细介绍了如何配置这些组件,并给出了一些示例。 接下来,手册重点介绍了如何连接这些组件,以构建一个完整的Fabric网络。手册详细介绍了如何配置节点之间的通信,如何创建和加入Channel,以及如何运行智能合约。这些步骤是手动组建Fabric网络的核心内容,学习者需要仔细理解和熟悉。 除了步骤之外,手册还提供了一些注意事项和最佳实践。例如,手册强调了网络的安全性和可扩展性,提供了一些建议和建议,帮助学习者更好地设计和管理Fabric网络。 总之,《day03-手动组建fabric网络.pdf》是一份非常实用的手册,适合想要了解如何手动组建Fabric网络的人士。通过学习这个手册,学习者可以获得丰富的知识和实践经验,从而能够独立地组建和管理自己的Fabric网络

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值