转载前注明出处欢迎转载分享

实现代码github仓库地址:戳这里(https://github.com/chensguo8099/network_programming/tree/master/Serv_sendfiles_to_Client)
课程要求:
相关函数:
(一)C/S即客户端(client)与服务器(server),简单文件传输系统的实现运用了网络编程中socket套接字等相关知识,客户端与服务器建立连接用到了许多网络编程相关API函数:
client:connect
server:bind listen accept
参考相关内容:戳这里(http://blog.sina.com.cn/s/blog_12c2b05e90102x6rl.html)
(二)在客户端与服务器建立连接之后我们再使用文件相关知识对服务器端文件内容读出发送至TCP缓冲区,之后再由TCP缓冲区发送至客户端本地空文件中,即实现了服务器与客户端的文件传输功能。其中发送至TCP缓冲区和从TCP缓冲区取数据的过程用到了send,recv函数。
#include < sys/types.h>
#include < sys/socket.h>
ssize_t send(int sockfd, const void*buf, size_t len, int flags);
int sockfd:accept函数返回的文件描述符
const void* buf:为要发送的缓冲区地址
size_t len:即为发送数据的大小
int flags:一般填0即可
#include < sys/types.h>
#include < sys/socket.h>

ssize_t recv(int sockfd, void* buf,size_t len, int flags);
int sockfd:套接字文件描述符
void* buf:为要发送的缓冲区地址
size_t len:即为发送数据的大小
int flags:一般填0即可

(三)实现该任务还用到了对文件的读写操作,我们应当将文件数据在服务器端读取出来并发送,然后在客户端创建一个空文件,再将客户端接收到的数据读入到该空文件中,用到了read和write函数。
#include < unistd.h >
ssize_t read(int fd, void* buf, size_tcount);
int fd:当打开一个文件时open函数所返回的文件描述符
void* buf:即为从文件读数据至缓冲区
size_t count:即为读取数据的大小
#include < unistd.h>
ssize_t write(int fd, const void* buf,size_t count);
int fd:当打开一个文件时open函数所返回的文件描述符
void* buf:即为把缓冲区数据写至文件
size_t count:即为读取数据的大小


遇到的问题:
  • 开始错误理解为服务器端向客户端发送文件名,之后客户端响应到该文件名并且将该文件发送至服务器端。其中客户端响应服务器发来的文件名时用了strcmp字符串比较函数来确认服务器所发送的文件名在客户端是否存在。
  • 理解正确后,在实现数据的发送接收时,起初用到的是c++中的流式输入输出文件(c语言的文件掌握不熟练),但在实现mp3数据传输时未能达到预期效果,然后学习了open,read,write这样的函数,并且去运用,完成了数据流的读出和写入。

代码展示:
1.头文件:
unp.h (head file) 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef __unp_h
#define __unp_h

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

//c++ headfile
#include <iostream >
#include < fstream>
#include < iomanip>
#include < cstdio>
using namespace std;

#ifndef HAVE_BZERO
#define bzero(ptr, n) memset(ptr, 0, n)
#endif  //bzero

#define MAXLINE 4096
#define LISTENLINE 1024
#define SA struct sockaddr

#endif



2.服务器(server)

c++ code (server)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

#include "unp.h"

int main(int argc, char **argv)
{
    int sockfd;
    char sendname[256] = "0";
    char recvline[MAXLINE + 1] = "0";
    struct sockaddr_in servaddr;

sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //AF_INET is IPv4
    //int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0)
    {
        printf(">>create socket error < 0");
        exit(1);
    }

bzero(&servaddr, sizeof(servaddr));
    //memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(9500);

if(bind(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf(">>bind error\n");
        exit(1);
    }//bind socket

if(listen(sockfd, LISTENLINE) < 0)
    {
        printf(">>listen error\n");
        exit(1);
    }//listen socket

int connfd = accept(sockfd, (SA *)NULL, NULL);
    if(connfd < 0)
    {
        printf(">>accept error\n");
        exit(1);
    }//accept message

//------------------send mp3 name----------------------
    read(STDIN_FILENO, sendname, sizeof(sendname));
    send(connfd, sendname, sizeof(sendname), 0);
    //-----------------------------------------------------
    int fd = open("music.mp3", 'r');
    char buffer[2048];
    while(1)
    {
        if(read(fd, buffer, sizeof(buffer) - 1))
        {
            send(connfd, buffer, sizeof(buffer) - 1, 0);
        }
        else
            break;
    }
    close(fd);
    exit(0
);
}

3.客户端(client)
c++ code (client)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

#include "unp.h"

int main(int argc, char **argv)
{
    int sockfd;
    char recvname[256] = "\0";
    struct sockaddr_in servaddr;

if(argc != 3)
    {
        printf(">>please input IP and PORT\n");
        exit(1);
    }

//create socket
    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sockfd < 0)
    {
        printf(">>create socket error\n");
        exit(1);
    }

//init servaddr
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(9500);

int connfd = connect(sockfd, (SA *)&servaddr, sizeof(servaddr));
    if(connfd < 0)
    {
        printf(">>connect error\n");
        exit(1);
    }
    //-------------------recv mp3 name--------------------
    recv(sockfd, recvname, sizeof(recvname), 0);
    printf(">>mp3 name is : %s\n", recvname);
    //----------------------------------------------------
    char buffer[2048];
    int fd = open("NEWmusic.mp3", O_RDWR | O_CREAT);
    while(recv(sockfd, buffer, sizeof(buffer) - 1, 0) > 0)
    {
        write(fd, buffer, sizeof(buffer));
    }
    close(fd);
    exit(0
);
}

运行截图:
1.启动服务器:


2.启动客户端,连接ip为127.0.0.1 连接端口为9500

3.服务器发送要发送的文件的名字


4.随即发送了服务器端的music.mp3文件

5.客户端响应服务器的发送,并且收到文件


6.客户端收到的文件为NEWmusic.mp3


7.该新文件的内容如图,与music.mp3一样


总结:
本次设计使我了解socket套接字间通信的过程,并熟悉了文件数据的读出和写入。

C/S架构的简单文件传输系统的实现相关推荐

  1. python开发cs软件_python cs架构实现简单文件传输

    本文为大家分享了python cs架构实现简单文件的传输代码,供大家参考,具体内容如下 要实现简单文件的传输我们必须考虑这些问题: 1.什么是c/s架构? 顾名思义,就是客户端端/服务器架构.不同的人 ...

  2. 基于socket的简单文件传输系统

    [实验目的及要求] 在 Uinx/Linux/Windows 环境下通过 socket 方式实现一个基于 Client/Server 文件传输程序. [实验原理和步骤] 1. 确定传输模式:通过 so ...

  3. 创建带有关联的 XML 架构的 XML 文件 从 XML 文件创建 XML 架构

    一.创建带有关联的XML 架构的XML 文件 1.创建新的 Windows 应用程序项目 首先需要在 Visual Basic 或 Visual C# 中创建新的 Windows 应用程序.创建一个新 ...

  4. 简单的Linux操作命令,Linux系统简单文件操作命令

    项目 内容 作业课程归属 学号-姓名 17041419-刘金林 作业学习目标 1)学习Linux的基本操作命令:2)在终端上运用命令行去实现基本文件操作 1.查看当前目录 问:提示符$与#的区别? 答 ...

  5. 简单文件传输协议TFTP分析还原

    " 介绍TFTP协议及传输内容的还原." TFTP,全称为Trivial File Transfer Protocol,即简单文件传输协议,是一个用来在客户端与服务器之间进行简单文 ...

  6. 教你如何运用python实现简单文件读写函数

    这篇文章主要为大家详细介绍了python实现简单文件读写函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 python作为脚本性语言,加上它的简便易用性.会经常当作脚 ...

  7. 让架构更简单,QCon上海2016热点前瞻

    架构设计是软件设计过程中最重要的部分之一,是降低成本.改进质量.按时和按需交付产品的关键因素,架构设计的优劣会直接影响到目标系统的各个质量属性.对于软件开发而言,架构设计能保证系统质量,可以全过程指导 ...

  8. linux写入系统状态到文件夹,实验二 Linux系统简单文件操作命令

    *实验二** Linux系统简单文件操作命令 项目内容 这个作业属于哪个课程 这个作业的要求在哪里 学号-姓名 17041518-孙小文 作业学习目标 学习在Linux系统终端下进行命令行操作 :掌握 ...

  9. 简单文件加密解密系统(c++)

    简单文件加密解密系统(c++) 一.原理 二.实现思路 三.c++代码 四.运行结果 一.原理   为了实现加解密,首先需要一个码本文件.一个基本的码本文件包含26个字母,即a~z打乱顺序的结果,比如 ...

最新文章

  1. docker查看现有容器_如何使用Docker将现有应用程序推送到容器中
  2. python ftp文件夹文件递归上传推送
  3. 淮阴工学院计算机期末考选择题题库,淮阴工学院计算机导论题库.doc
  4. tf.reduce_sum()_tf.reduce_mean()_tf.reduce_max()
  5. ubuntu 安装 spconv
  6. 最简单jquery轮播图效果
  7. JEPaas代码((列表,表单)确认入库按钮
  8. 什么是 ABAP Field Symbol
  9. 铁血规则:事件预订与取消预订
  10. Node.js读取mongoDB并输出json数据
  11. [jQuery基础] jQuery动效案例(二) -- 图标特效、无限循环滚动(简易轮播图)
  12. ftp服务器通常提供文件上传和,基于FTPClient的文件上传至Nginx服务器
  13. openlayers2 开发如何判断一个marker所在的点是否在一个多边形内部
  14. shiny app制作基本思路
  15. 判断当前打开的是手机还是pc浏览器还是微信浏览器
  16. java敏捷开发的落地与实施_20165219 《Java程序设计》实验三(敏捷开发与XP实践)实验报告...
  17. iReport制作EXCEL、PDF或者HTML文件
  18. 干支纪年法简便算法_初中阶段常用的四种历史纪年法
  19. 字符区位码 java_用Java取得汉字的区位码
  20. 数字化时代,更多的徐玉玉需要保护

热门文章

  1. linux档案权限655,Linux 的档案权限与目录配置
  2. java从ftp上下载图片到客户端本地
  3. 如何在 DAX 计算中隐藏未来日期?
  4. 基于webrtc的小型直播平台
  5. osgearth 仿真平台之卫星仿真(实现STK卫星仿真基本功能)
  6. ajaxSubmit,json,struts2,提示保存“json返回值”
  7. 国外LEAD赚美金项目操作介绍
  8. 一种可以使人体朝向神圣生命的电脑
  9. 爬虫训练场项目,1小时掌握 Bootstrap 网格系统
  10. 什么是沟通能力?如何提高沟通能力?