网络间通信socket传输任意格式任意大小的文件

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错

<

div id=”content”>最近看到很多网友写的socket程序,试验了几个,发送”Hello,world”时都没有问题,但在传输较大文件,比如一个200M的文件时,都不能成功,即使成功了,server端也存在保存的问题, 有的是乱码,也有文件大小不对的情况,这两天工作不忙,我也草草写了一些代码,实现了可以传输任意格式任意大小的文件,几位同事帮我一起做了测试,传送几百M的文件速度还是很快的,而且也没有丢数据的问题。  代码原理很简单,所以也没有做注释,大家可以把代码copy下来,自己把玩一下。现在我跟同事之间传送datasheet,都在使用我的程序, 其实我也是个入行不深的人,代码并没有经过优化,很多printf() 是多余的,也有的地方写的很麻烦。希望大家给以批评,给以帮助。

由于 网络接口MTU的限制(一般mtu为1500),大些的文件只能分多次发送,这样就有几个问题:分几次发送?一次发送多大? 保存端的怎么保存?

我的办法是:通过定义一个shouldoplen,来说明一次操作需要操作的长度,如果要发送的文件较小(跟buf相比),shouldoplen 就是读取的文件大小,如果文件较大,需要多次发送,那么shouldoplen 就是buf  的长度,通过多次读取,发送, 直到发送出去的总长度oplencount  等于文件的大小,这时一个文件就算完整发送成功了。

编译时:

gcc  socket_server.c -lpthread  -o server

gcc  socket_client.c -o client

使用时:

在一端打开server

#./server

令一端使用client

#./client ./han/docunt/Linux_dd.pdf  Linux_dd.pdf

这样就把./han/docunt/Linux_dd.pdf 这就文件  发送server端,保存名为Linux_dd.pdf

当然,前提是在sock_client.c  中的把目的IP改为你要连接的目的IP。

***********************这是data.h****************

#ifndef DATA_H
#define DATA_H

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include “data.h”

typedef  unsigned int uint;

struct data{

    char filename[30];              //要发送的文件名(可含路径)

    char filesavename[30];    //要保存的文件名(可含路径)
   
    uint filelen;                        //文件从字节数

    uint shouldoplen;            //一次要操作的字节数
   
    uint oplencount;                // 操作的字节总数

    char filebuf[1300];                //由于mtu为1500,在不改动mtu的情况下,1300没有问题。

   
};

struct data_return {
       
    int writelen;                          //server端保存文件时,一次写的长度
   
    int writelencount;¼/div>

未经允许不得转载:演道网 » 网络间通信socket传输任意格式任意大小的文件

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册