设为首页 加入收藏

TOP

网络间通信socket传输任意格式任意大小的文件
2014-11-24 08:29:36 来源: 作者: 【 】 浏览:0
Tags:网络 通信 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; //一次接受到的长度
};


#endif


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下i2c与时钟芯片PCF8563的通.. 下一篇Java代码生成MyEclipse注册码

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)