项目:基于TCP的文件传输系统

news2024/12/28 12:38:43
项目介绍:
模拟FTP原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,那么清空文件然后写入。
项目技术点:
TCP客户端和服务器的搭建
目录IO获取路径下的文件名用于展示
标准IO或文件IO的打开,读取以及写入操作文件
TCP协议需要考虑如何防止粘包的发生(建议发送和接收的大小一致)
参考内容:

(1)client.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

int main(int argc, const char* argv[])
 {
   //1.socket
   int sockfd = socket(AF_INET,SOCK_STREAM,0);
   if(sockfd < 0)
   {
    perror("socket is error:");
    return -1;
   }
   //绑定套接字
   struct sockaddr_in saddr,caddr;
   saddr.sin_family = AF_INET;
   saddr.sin_port = htons(atoi(argv[2]));
   saddr.sin_addr.s_addr = inet_addr(argv[1]);
   
   char buf[128];
   if(connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)) < 0)
   {
    perror("connect is error:");
    return -1;
   }
   while(1)
   {
    //选择功能
      printf("功能1--------list--------\n");
      printf("功能2--------put--------\n");
      printf("功能3--------get--------\n");
      printf("功能4--------quit-------\n");

      printf("请选择功能:\n");
      int num;
      scanf("%d",&num);
      //显示该目录下的所有文件
      if(num == 1)
      {
        send(sockfd,&num,4,0);
        while(1)
        {
          char stu[128];
          int flag = 1;
          send(sockfd,&flag,4,0);
          int res = recv(sockfd,stu,sizeof(stu),0);
          printf("%s\n",stu);
          if(stu[0] == 0)
          {
            break;
          }
        }
      }
      //上传文件
      else if(num  == 2)
      {
        printf("请输入要上传的文件名\n");
        send(sockfd,&num,4,0);
        char stu[512];
        scanf("%s",stu);
        //以只读形式打开已有文件
        int fd = open(stu,O_RDONLY);
        //判断文件是否存在
        if(access(stu,F_OK) == -1)
        {
            printf("输入文件不存在,请重新输入:\n");
            break;
        }       
        while(1)
        {
          char s[512];
          int flag = 0;
          int res = read(fd,s,sizeof(s));
          if(res == 0){break;}
          send(sockfd,s,sizeof(s),0);
          recv(sockfd,&flag,4,0);
        }
         printf("上传成功\n");
      }
      //下载文件
      else if(num == 3)
      {
        send(sockfd,&num,4,0);
        printf("请输入要下载的文件\n");
        char c[32];
        scanf("%s",c);
        if(c[strlen(c)-1] == '\n')
           c[strlen(c)-1] = '\0';   
        send(sockfd,c,32,0); 
        //创建新的文件并打开 
        int fd = open(c,O_WRONLY | O_TRUNC | O_CREAT,0666);
        char ct[256]="";  
        while(1)
        {
          int flag = 1;
          int res = recv(sockfd,ct,sizeof(ct)-1,0);
          if(strlen(ct)==0)
		  {
			  break;
		  }
          //写入新的文件内,下载成功
          write(fd,ct,strlen(ct));
        }
         printf("下载成功\n");
         //关闭文件
         close(fd);
      }
      //退出(仅客户端),服务端仍然等待其他客户端连接
      else if(num == 4)
      {
        send(sockfd,&num,4,0);  
      }
      else
      {
        printf("抱歉,您输入的数字有误,请重新输入\n");
      }
   }
   close(sockfd);   
    return 0;
}
(2)server.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <dirent.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

int main(int argc, const char* argv[]) 
{
    //1.socket
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        perror("socket is error:");
        return -1;
    }
 //绑定套接字
 struct sockaddr_in saddr,caddr;
 saddr.sin_family = AF_INET;
 saddr.sin_port = htons(atoi(argv[1]));
 saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
 int len = sizeof(caddr);

 char buf[128];
 if(bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)) < 0)
 {
    perror("bind is error:");
    return -1;
 }
 if(listen(sockfd,5) < 0)
 {
    perror("listen is error:");
    return -1;
 }
 while(1)
 {
   printf("-------等待客户端连接-----------\n");
   int acceptfd = accept(sockfd,(struct sockaddr *)&caddr,&len);
   if(acceptfd < 0)
   {
      perror("accept is error:");
      return -1;
   }
   printf("-------客户端连接成功------------\n");
   while(1)
   {
      int num;
      printf("请选择功能\n");
      int res = recv(acceptfd,&num,sizeof(num),0);

      if(res < 0)
      {
         perror("recv is error:");
         return -1;
      }
      else if(res == 0)
      {
         printf("recv is exit:\n");
         break;
      }
      else
      {
         if(num == 1)
         {
            struct dirent *file = NULL;
            DIR *dp = opendir("./");
            if (dp == NULL) 
            {
            perror("opendir is error:");
            return -1;
            }
          while((file = readdir(dp)) != NULL) 
               {
                  if(file->d_name[0] == '.' )
                  {
                     continue;
                  }
                  int flag = 0;
                  recv(acceptfd,&flag,4,0);
                  send(acceptfd,file->d_name,128,0);
               }
               int flag = 0;
               recv(acceptfd,&flag,4,0);
               char bb[128] ={0};
               send(acceptfd,bb,128,0);
         }
         else if(num == 2)
         {
            //新建文件并打开
            int fd = open("./3",O_WRONLY | O_TRUNC | O_CREAT,0666);
            while(1)
            {
             char ss[512];
             int flag = 1;
             //接收内容
             int res = recv(acceptfd,ss,sizeof(ss),0);
             if(res == 0){break;}
             //写入
             write(fd,ss,strlen(ss));
             send(acceptfd,&flag,4,0);                         
            }
            //关闭文件
            close(fd);
         }
         else if(num == 3)
         {
            printf("进入功能:\n");
            char c[32] = {0};
            recv(acceptfd,c,32,0);
            printf("%s\n",c);
            int fd = open(c,O_RDONLY);

            while(1)
            {
			  char st[256]="";
			   int flag=1;   
               int res = read(fd,st,sizeof(st)-1);
               //阻塞性接收并传送回文件数据与内容
                if(res == 0)
                {
				    char dt[256]="";  
               	    send(acceptfd,dt,sizeof(dt)-1,0);
				    break;
                }
			    if(flag==1)
			    {
               	    send(acceptfd,st,sizeof(st)-1,0);			
			    }
            }
         }
         else if(num == 4)
         {
            break;
         }
         else
         {
            printf("抱歉,您输入的数字有误,请重新输入\n");
         }   
   }
   }
 }
close(sockfd);
return 0;
}

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

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

相关文章

2024年整理的自动化测试面试题及答案

selenium中如何判断元素是否存在&#xff1f; 没有提供原生的方法判断元素是否存在&#xff0c;一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f;不可以&#xff0c;想点击的话&#xff0c;可以用…

C# 爬虫技术:京东视频内容抓取的实战案例分析

摘要 随着互联网技术的飞速发展&#xff0c;数据的获取和分析变得愈发重要。爬虫技术作为数据获取的重要手段之一&#xff0c;广泛应用于各个领域。本文将重点探讨C#语言在京东视频抓取中的实现过程&#xff0c;分析其技术细节&#xff0c;并提供相应的代码实现。 引言 京东…

python学习之路 - 面向对象编程

目录 一、面向对象编程1、成员方法a、类的定义和使用b、案例 2、类和对象3、构造方法4、其他内置方法&#xff08;魔术方法&#xff09;5、面向对象三大特性——封装a、介绍&#xff1a;b、表现形式&#xff1a;私有成员变量与私有成员方法c、作用 6、面向对象三大特性——继承…

iview Cascader 组件动态数据回显

在使用Cascader组件动态加载数据后&#xff0c;编辑的时候回显会有问题 问题如下&#xff1a;回显的时候&#xff0c;如果是多级&#xff0c;只显示了一级且&#xff0c;中间会闪一下 经过多方查找资料发现&#xff0c;是callback造成的。给组件增加on-visible-change事件监听…

如何下载淘宝的主图视频

目录&#xff1a; 1、通过插件插件下载短视频 1&#xff09;获取“Microsoft Edge扩展” 2&#xff09;搜索“aix智能下载器” 3&#xff09;将插件钉在浏览器上 4&#xff09;嗅控并下载视频 2、从其他来源安装插件 1、通过插件插件下载短视频 1&#xff09;获取“M…

孙宇晨:以区块链科技为翼,青年企业家引领社会进步新航向

​ 孙宇晨&#xff0c;作为区块链领域的一位青年企业家&#xff0c;以其大胆的创新精神和卓越的远见&#xff0c;正在用区块链技术推动社会的进步。他不仅在加密货币和区块链技术领域取得了令人瞩目的成就&#xff0c;还通过不断的努力&#xff0c;致力于将这些技术应用…

FreeRTOS 列表 List 源码解析

目录 一、链表及链表项的定义1、链表节点数据结构 xList_ITEM2、链表精简节点结构 xMINI_LIST_ITEM3、链表根节点结构 xLIST 二、链表的相关操作1、初始化1.1 链表节点初始化1.2 链表根节点初始化 2、插入2.1 将节点插入到链表的尾部2.2 将节点按照升序排列插入到链表 3、删除4…

(go)线性表的顺序存储

闲来无事&#xff0c;更新一下&#xff0c;线性表的顺序存储&#xff0c;go语言版本&#xff0c;效果都已经测试过&#xff0c;下面给出各部分细节 文章目录 1、生成一个线性表2、查找3、插入4、求长度5、改值6、删除7、遍历8、测试程序9、完整代码总结 package mainimport &q…

VBA技术资料MF195:屏蔽工作表中的粘贴输入

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

关于测试工程师在性能测试工具jmeter的熟悉和精通

经过一周的jmeter接口编写&#xff0c;不不不&#xff0c;是一年1-2次的jmeterd 使用&#xff0c;每次都是新的发现&#xff0c;新的起点&#xff01;&#xff01; 去年10月学习过的东西&#xff0c;现在还是不记得当时怎么这么聪明&#xff0c;于是&#xff0c;每次都是0基础…

笔试训练,牛客.合唱团牛客.kannan与高音牛客.拜访(BFS)牛客.买卖股票的最好时机(四)

目录 牛客.合唱团 牛客.kannan与高音 牛客.拜访&#xff08;BFS&#xff09; 牛客.买卖股票的最好时机(四) 牛客.合唱团 dp[i][j]:从1到i,中挑选最大乘积是多少&#xff0c;但是我们会发现状态转移方程推不出来&#xff0c;我们不知道如何推导的任意两个人&#xff0c; 从[…

[解决]Invalid configuration `aarch64-openwrt-linux‘: machine `aarch64-openwrt

背景 交叉编译libev-4.19 问题 checking host system type… Invalid configuration aarch64-openwrt-linux: machine aarch64-openwrt’ not recognized 解决 打开config.sub&#xff0c;在244行后添加"| aarch64-openwrt \ "

RK 方案u-boot阶段添加驱动

驱动部分&#xff1a; u-boot/drivers/video/drm/gpio_init.c /** (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd** SPDX-License-Identifier: GPL-2.0*/#include <config.h> #include <common.h> #include <errno.h> #include <malloc…

jmeter连接mysql数据,并将查询结果存储到指定txt文件中

1、首先jmeter先进行连接mysql相关的配置&#xff0c;我之前已经有教程了就不赘述了&#xff0c;教程链接如下 jmeter连接mysql数据库以及常规用法-CSDN博客 2、当jmeter成功配置mysql数据库后&#xff0c;在JDBC Request组件中进行如下配置 Variable Name of Pool declared…

关于springboot对接通义千问大模型的尝试

今天正在路上刷手机&#xff0c;突然看到群里有人发了一个链接&#xff0c;内容是Spring Cloud Alibaba AI 的使用&#xff0c;spring cloud AI的使用&#xff0c;于是就想着玩一玩试试&#xff0c;难度不大&#xff0c;就是有些文档的坑&#xff0c;这里做一个记录&#xff0c…

基于RK3588+MCU智能清洁车应用解决方案

智能清洁车应用解决方案 在智慧城市建设发展的过程中&#xff0c;智慧环卫是打造智慧城市的重要组成部分&#xff0c;智能清洁车作为实现环卫智能化、提升作业效率和服务质量的关键工具&#xff0c;发挥着不可或缺的作用。 智能清洁车集成了激光雷达、双目视觉、多重传感器以及…

九月更新|用这5个简单技巧,新手在国内也能轻松使用ChatGPT,GPT新手使用手册(学术教师)

一、 ChatGPT可以做什么&#xff1f; 简单来说&#xff0c;ChatGPT就像一个超级智能的聊天机器人&#xff0c;它可以做很多事情。你可以把它想象成一个非常聪明的助手&#xff0c;随时随地帮你解答问题、提供建议、写文章、甚至讲笑话。以下是几个具体的例子&#xff1a; 1. …

论文浅尝 | 超越实体对齐: 通过实体关系协同实现完整的知识图谱对齐

笔记整理&#xff1a;米尔扎提阿力木&#xff0c;天津大学硕士&#xff0c;研究方向为大模型 论文链接&#xff1a;https://arxiv.org/abs/2407.17745 摘要 知识图谱对齐(Knowledge Graph Alignment, KGA)旨在整合来自多个来源的知识&#xff0c;以解决单个知识图谱在覆盖范围和…

一文带你了解可观测领域中APM与eBPF的技术差异

近年来&#xff0c;随着eBPF技术的兴起&#xff0c;很多人有这样的疑惑&#xff1a;eBPF和APM有什么区别&#xff1f;他们是竞争关系还是合作关系&#xff1f;本文将就此展开讨论&#xff0c;并给出切实有效的落地方案。 01APM APM全称&#xff1a;Application Performance Ma…

vulhub xxe靶机

步骤一&#xff0c;访问浏览器 步骤二&#xff0c;输入/robots.txt 步骤三&#xff0c;发现存在用户登录的一个界面/xxe 我们登录进去 步骤四&#xff0c;随便输入一个数字或者字母打开BP 抓到包之后发送的重放器里边 通过抓包发现是XML数据提交 步骤五&#xff0c;通过php…