Linux------小网盘(1)

  

一:要求

  利用Linux Socket进行文件传输,本次只支持client端向sever端上传文件

二:实现提示:

  client.c

  client的参数有两个,分别是服务器主机名和端口;

  在while循环中输入你想要传输的文件名,然后建立socket,通过服务器主机名和端口连接服务器;

  打开文件,在while循环中读取文件,发送文件

  sever.c

  在while循环中accept客户端的连接,接受数据并写入文件中

  (也可以选择select()accept客户端的连接,在while循环中接受数据并写入文件中)

三:程序

  sever.c (服务器端)

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>

#define  PORT      5168
#define  MSGLEN    1024

int main(int argc, char **argv)
{
    int severFd, clientFd;
    int fp,flags;
    socklen_t addrlen;
    struct sockaddr_in severAddr, clientAddr;
    char recvBuff[MSGLEN];
    char filename[100];
    int recv_len;

    if((severFd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror("sockst() error");
        exit(-1);
    }

    severAddr.sin_family = AF_INET;
    severAddr.sin_port   = htons(PORT);
    severAddr.sin_addr.s_addr = htons(INADDR_ANY);
    bzero(&severAddr.sin_zero, 8);

    if(bind(severFd, (struct sockaddr*)&severAddr, sizeof(struct sockaddr)) == -1) {
        perror("bind() error");
        exit(-1);
    }

    if(listen(severFd, 1) == -1) {
        perror("listen() error");
        exit(-1);
    }

    addrlen =sizeof(struct sockaddr);
    while(1) {
        flags = 0;
        if((clientFd = accept(severFd, (struct sockaddr*)&clientAddr, &addrlen)) == -1){
            perror("accept() error");
            exit(-1);
        }
        printf("recv file fome ip:%s  port: %d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
        if(recv(clientFd, filename, strlen(filename), 0) < 0){
            perror("recv filename error");
            break; //less
        }

        fp = open(filename, O_RDWR | O_CREAT, 777);
        while((recv_len = recv(clientFd, recvBuff, MSGLEN, 0)) > 0) {
            flags++;
            if(flags == 1) {
                printf("recv file start");
            }
            else {
                printf(".");
            }
            if(write(fp, recvBuff, recv_len)) {
                bzero(&recvBuff, MSGLEN);
            }else {
                perror("write() error");
                break;
            }
        }
        if(flags == 0)
             perror("recv() error");
        if(flags > 0){
               printf("\nrecv success\n");
             close(clientFd);
        }
    }

    close(severFd);
    return 0;
}

  client.c(客户端)

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MSGLEN 1024

struct ADDR {
    int port;
    char name[32];
};

void file_send(struct ADDR addr, char *filename)
{
    int sockfd;
    FILE* fp;
    struct sockaddr_in sevrAddr;
    struct hostent *host;
    char readBuff[MSGLEN];
    int len;

    host = gethostbyname(addr.name);

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket() error");
        exit(-1);
    }else
        printf("socket ok\n");

    sevrAddr.sin_family = AF_INET;
    sevrAddr.sin_port   = htons(addr.port);
    sevrAddr.sin_addr   = *((struct in_addr*)host->h_addr);
    bzero(&sevrAddr.sin_zero, 8);
//    printf("ok2\n");
    if(connect(sockfd, (struct sockaddr*)&sevrAddr, sizeof(struct sockaddr)) == -1){
        perror("connect() error");
        exit(-1);
    }else
        printf("connect ok\n");

//    fp = open(filename, O_RDONLY);
    if(send(sockfd, filename, sizeof(filename), 0) < 0) {
        perror("send filename error");
        exit(-1);
    }

    fp = fopen(filename, "rb");
    if(fp != NULL){
        printf("send file");
        while(1) {
            if((len = fread(readBuff, 1, MSGLEN, fp)) > 0) {
                if(send(sockfd, readBuff, len, 0) < 0){
                    perror("send() error");
                    exit(-1);
                } else {
                    printf(".");
                    bzero(&readBuff, MSGLEN);
                }
            } else if(len == 0){  //等于0表示文件已到末尾
    //            send(sockfd, readBuff, strlen(readBuff), 0);
                printf("\nfile send success\n");
                break;
            } else {
                perror("read() error");
                exit(-1);
            }
        }
    }else {
        printf("open file failed\n");
        exit(-1);
    }
    fclose(fp);
    close(sockfd);
}

int main(int argc, char **argv)
{
    struct ADDR useraddr;
    char filename[100]; 

    if(argc != 3) {
        printf("Usage: ./client [hostname] [port]");
        exit(-1);
    }

    strcpy(useraddr.name, argv[1]);
    useraddr.port = atoi(argv[2]);

    while(1) {
        printf("please input filename of you want send\n");
        fgets(filename, 20, stdin);
        filename[strlen(filename)-1] = 0;
//        printf("ok1\n");
        file_send(useraddr, filename);
    }
    return 0;
}

四:现象

  略(已实验,运行正确)

时间: 2024-11-10 11:12:17

Linux------小网盘(1)的相关文章

网盘的倒掉是不可避免的,因为做网盘的成本是非常巨大的(国内几大网盘就剩百度云、天翼云、和彩云),中国的独服太贵

作者:冯硕链接:http://www.zhihu.com/question/51803053/answer/127549782来源:知乎著作权归作者所有,转载请联系作者获得授权. 很正常的情况.目前全国所有的网盘商均处于巨亏的状态,撤退是非常正确的选择.我在这个回答下新浪微盘为什么要停止个人免费服务?有什么影响? - 冯硕的回答 就说过这个问题了.网盘的倒掉是不可避免的,因为做网盘的成本是非常巨大的.现在活着的网盘,大家且用且珍惜.当时新浪微盘倒掉的时候,我的确准考虑做网盘方面的业务.当时我不仅

破解百度网盘限速:IDM+外链下载

原链接 前言 随着国内的一些比较大的网盘一家家的倒下,国内流派众多的小网盘又因为有广告.不可靠等原因,使用时不太放心:而国外的 OneDrive.Google Drive 等又因为众所周知的原因,在国内使用多有不便.百度网盘变得一家独大. 但是,因为百度网盘对普通用户的限速,如果不充值会员的话,"小水管"的下载速度实在是感人.而一些保存在百度网盘的文件又不得不用它下载. 当然,"天下没有免费的午餐",百度网盘的会员制也无可厚非.然而,当我去充值会员时发现:买了会员也

根据之前的博文,我把给同学做的三子棋小游戏的代码发出来,只是界面很丑很丑,AI算法很笨很笨,过几天我传到网盘上,提供大家下载娱乐

1 background_image_filename = 'blackground.png' 2 black_mouse_image_filename = 'black.png' 3 white_mouse_image_filename = 'white.png' 4 restart_icon_filename='restart.png' 5 pingju_icon_filename='pingju.jpg' 6 win_icon_filename='win.jpg' 7 lose_icon_

打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源

前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字游戏中的公司都心知肚明. 在不需要增加任何网盘上传下载带宽和硬件设备投入的情况下,又可以用TB级别网盘这样的字眼来夺人眼球,在网络上大肆炒作一番,这比用钱买广告来推广网盘有效得多了.在这场网盘炒作中,率先“挑起事非”的两家百度网盘和360网盘获利最多. 尤其是百度网盘,应该算正式成长为国内网盘界中老

linux系统编程视频 百度网盘下载

本帖最后由 雇佣兵333 于 2015-5-19 16:15 编辑 c教程目录: Linux开发快速入门培训gcc快速入门Makefile快速入门GDB快速入门 Linux系统编程之文件篇01认识计算机系统(上)计算机系统组成计算机系统硬件组成总线I/O设备内存处理器(运算器+控制器) 02认识计算机系统(下)什么是操作系统Linux内核模块操作系统管理硬件操作系统三个基本抽象进程上下文切换进程虚地址空间虚拟文件系统(VFS) 03系统编程介绍系统编程与应用编程系统资源系统调用系统调用与C库关系

Linux网络编程视频 百度网盘

Linux网络编程(总共41集)讲解Linux网络编程知识,分以下四个篇章.Linux网络编程之TCP/IP基础篇Linux网络编程之socket编程篇Linux网络编程之进程间通信篇Linux网络编程之线程篇Linux网络编程之TCP/IP基础篇01TCPIP基础(一)ISO/OSI参考模型TCP/IP四层模型基本概念(对等通信.封装.分用.端口)02TCPIP基础(二)最大传输单元(MTU)/路径MTU以太网帧格式ICMPARPRARP03TCPIP基础(三)IP数据报格式网际校验和路由04

Linux下下载百度网盘资料

因为百度网盘没有Linux下的客户端,所以无法直接下载网盘里的资料了.各路大神各显神通,提出了各种解决方法,这里只介绍两种. 1.BaiduPCS Github上有人通过Go语言写了一个Baidu网盘的客户端,下载地址:https://github.com/iikira/BaiduPCS-Go  Ubuntu 只需要下载安装包 BaiduPCS-Go-v3.5.6-linux-amd64.zip,运行 BaiduPCS-Go即可,使用的时候和shell 终端方法一样,下载速度也足够快.主要特色:

Windows and Linux挂载阿里云NAS的NFS网盘

前情提要: 阿里云的NAS存储有两种模式 NFS,SMB其中SMB模式的存储 仅仅能挂载到Windows服务器,Linux暂时不支持.这时候如果Windows,Linux ECS想要挂同一块网盘的话只能选择NFS模式. Linux yum install nfs-utils -y mount -t nfs -o vers=4,minorversion=0,noresvport 1xxxxxxxxxxxx83.cn-beijing.nas.aliyuncs.com:/ /mnt mount -t

网盘限速怎么办? 小编来支招!

随着360网盘的关闭,百度网盘脱颖而出,成为国内网盘的最优选择,然而作为最优选择的弊端也逐渐暴露出来,下载速度日益下降,显然是被限速了.例如,在带宽20M的网络环境下,下载大于1G的一个 War3.zip 单文件,百度限速后的下载速度只有256KB/s,而理论上的下载速度是可以达到2M/s的.那么,百度网盘被限速该怎么办? 众所周知,这是百度网盘引导用户充值会员的一个手段,但付费会员依旧限速就没办法忍了,这里有几个小贴士,希望对你有用哦~方法一:复制好你要下载的资源链接 在你的电脑上,用谷歌内核

Linux自制离线源,利用百度网盘等下载离线资源

CentOS安装Axel: 目前yum源上没有Axel,我们可以到http://pkgs.repoforge.org/axel/下载rpm包安装. 32位CentOS执行下面命令: wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.i386.rpmrpm -ivh axel-2.4-1.el5.rf.i386.rpm 64位CentOS执行下面命令: wget -c http://pkgs.repoforge.org/axel/ax