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