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

最近看到很多网友写的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;                //写的总数

int recvlen;                            //一次接受到的长度

};

#endif0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值