sockets网络编程文件传输

问题描述

sockets网络编程文件传输

socket编程,windows client端 linux server端,进行文件传输的时候,4K的文件接收成功,换成512MB的文件夹,接收之后显示0字节。大家知道怎么回事吗?
PS:文件放在server端。

解决方案

超出最大值了

socket编程基础5(linux中关于socket send一次可发送的最大值)

window中,socket send()函数可发6M一张的图片,可是同样的代码移植到Linux中就出问题,原因是这个的默认buffer不一样。
以下是Linxu中的socket的相关信息:

1、从socket里一次最大读取字节数取决于接收buffer的大小,亦即socket的SO_RCVBUF对应的数值的2倍,这个2倍关系是内核决定的。
2、所以关键在于SO_RCVBUF的大小了。SO_RCVBUF大小,每个系统可能不一样,比如我使用linux,rmem_max存储了它的最大值:
[root@localhost sockopt]# cat /proc/sys/net/core/rmem_max
124928

3、所以对于我这台电脑,最大接收buffer是124928*2的大小,也就是说最大允许一次读取124928*2大小了。

以下是linux对该buffer的描述
SO_RCVBUF
Sets or gets the maximum socket receive buffer in bytes. The kernel doubles
this value (to allow space for bookkeeping overhead) when it is set using set-
sockopt(2), and this doubled value is returned by getsockopt(2). The default
value is set by the /proc/sys/net/core/rmem_default file, and the maximum
allowed value is set by the /proc/sys/net/core/rmem_max file. The minimum

(doubled) value for this option is 256.

利用 int snd_size = 0; /* 发送缓冲区大小 /
int rcv_size = 0; /
接收缓冲区大小 /
socklen_t optlen; /
选项值长度 */
optlen = sizeof(snd_size);
err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
if(err<0){
printf("获取发送缓冲区大小错误n");
}

optlen = sizeof(rcv_size);
err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
if(err<0){
printf("获取接收缓冲区大小错误n");
}

printf(" 发送缓冲区原始大小为: %d 字节n",snd_size);
printf(" 接收缓冲区原始大小为: %d 字节n",rcv_size);

获取发送和接收buffer的大小。

设置 socket通信时的buffer大小
获取系统的最大buffer cat /proc/sys/net/core/rmem_max

snd_size = 10*1024; /* 发送缓冲区大小为8K /
optlen = sizeof(snd_size);
err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);
if(err<0){
printf("设置发送缓冲区大小错误n");
}
/

* 设置接收缓冲区大小
/
rcv_size = 10*1024; /
接收缓冲区大小为8K */
optlen = sizeof(rcv_size);
err = setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);
if(err<0){
printf("设置接收缓冲区大小错误n");
}
实际缓冲区的大小为设置缓冲区大小的两倍,这个一定要注意

////////////=================================================================================////////
socket send buffer(user malloc)========>内核buffer(TCP 收发Buffer)------------------>socket reciver buffer(uer malloc)
其中 socket send buffer(user malloc) 发送到 内核buffer时,发送一次就行了。
内核buffer到socket reciver buffer时,由于内核buffer有限,每次只能提取一部分,所以可以用while循环好几次。【send只需一次即可】

解决方案二:

参考链接

http://blog.csdn.net/virlhs/article/details/17679413

时间: 2024-08-10 21:39:15

sockets网络编程文件传输的相关文章

socket网络编程 文件传输的问题?

问题描述 socket网络编程 文件传输的问题? socket网络编程,目前是同时开启两个进程两个线程,同时从server那端传输两个文件过来,是可以实现,任意格式的文件和任何大小的文件都可以.现在的项目要求是这两个进程要同时传输一个文件.我的思路是一个进程传输该文件的前一半,另一个进程传输该文件的后一半,具体实现就不知道了,希望大家给点意见,已经摸索了好几天.毫无头绪啊!!!!!项目马上就要完成了,谢谢大家. 解决方案 RandomAccessFile,看看吧. 解决方案二: 循序渐进Sock

线程-windows 和 linux 网络编程文件传输

问题描述 windows 和 linux 网络编程文件传输 windows 两个线程,linux 两个进程,现在想传输一个文件,windows 这边其中的一个进程传一部分,剩下的由另外的一个进程来传.有什么好的方法吗?找了好多可是都没有相关的资料.谢谢大家. 解决方案 就是socket通信传递,windows做客户端,linux做服务端 解决方案二: Linux与Windows下文件传输windows到linux的文件传输linux 和 windows 文件传输

ios-android和iOS手机之间如何实现无网络的文件传输?

问题描述 android和iOS手机之间如何实现无网络的文件传输? 不需要蓝牙,不需要外部wifi,不走流量. 传输速度如何保证? 传输距离要求不高. iPhone不越狱. 求回答~ 解决方案 既不用网络也不用蓝牙?应该无解吧 解决方案二: 局域网内的话使用socket传送但是没蓝牙和WiFi你打算怎么传送数据?数据流量?你不会像发个短信发过去吧...... 解决方案三: iOS 和 安卓 通信使用socket 的话按照ProtoBuf格式是可以传送数据的文件估计也可以 解决方案四: iOS可以

Linux基本网络及文件传输命令

网络下载器-- wget wget命令语法: wget [参数][URL] 实例1  下载www.google.com网站首页的数据. [root@localhost local]# wget www.google.com 实例2  最多尝试5次下载文件http://www.apache.org/ images/ac2009eu_125x12 5_bas ic.gif. [root@localhost local]# wget –t 5 http://www.apache.org/im ages

Java网络编程之传输控制协议

传输控制协议是一种基于流的网络通讯方法,它与其它的任何协议都有很大 的不同.本文讨论TCP流以及在Java中怎样操作它. 一.概述 TCP提供的网络通讯接口与用户数据报协议(UDP)截然不同.TCP的特性使网 络编程很具魅力,而且它删除了UDP的很多干扰部分(例如数据包的排序和丢失 ),简化了网络通讯.UDP关心的是数据包的传输,而TCP关注的是建立网络连接 ,并在网络连接中发送和接收字节流. 数据包可以通过网络用多种方法发送,并且它们到达的时间可能不同.这有 利于性能的提高和程序的健壮性,因为

Windows Sockets网络编程(三) WINDOWS SOCKETS 1.1 程序设计

一.简介 WINDOWS SOCKETS是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets的基础上,又进行了新的扩充.这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制. WINDOWS SOCKETS由两部分组成:开发组件和运行组件. 开发组件:WINDOWS SOCKETS 实现文档.应用程序接口(API)引入库和一些头文件. 运行组件:WINDOWS SOCKETS 应用程序接口的动态链接库(WINSO

IOS开发之网络编程--文件压缩和解压缩

前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个第三方框架代码文件夹是SSZipArchive,使用cocoapods搜索也是搜索SSZipArchive.但是如果你在github上直接搜索ZipArchive,搜到点赞数最多,维护频繁的ZipArchive库,然后下载代码,其实就是这个SSZipArchive. 第三方框架github网址:ht

Java 网络文件传输

网络 读者范围: 本文是一篇简短入门文章.本文假设读者对Java的IO系统和Java的网络系统有所了解. 正文: 关于文件传输的问题,实际也是一种IO读写的基本问题.对于网络而言也是一种IO读写问题.因此所谓网络的文件传输实际是两种IO问题的综合讨论.这里我们首先分析一个图示.然后围绕这个图示来讨论: 图1: 分析图1我们基本可以知道从服务器文件系统中通过流把文件中的数据写入到服务器的进程中,然后把进程中的数据通过网络IO系统传递到客户机,这个阶段,网络中的数据以字节流的形式保存.当该字节流被客

JFtp 1.56发布 文件传输客户端

JFtp 是一个Swing Java网络和文件传输客户​​端.其功能是支持FTP,其他各种协议,如:SMB,SFTP,NFS,HTTP和使用第三方的APIs进行文件传输.它还包括多个高级的功能,如递归目录上传/下载,浏览FTP服务器传输文件,浏览局域网Windows共享资源,等等. JFtp 1.5该版本增加了由操作系统提供的应用程序打开本地文件的能力,提供更好的传输按钮,并删除一些旧的代码. 软件信息:http://sourceforge.net/projects/j-ftp/ 下载地址:ht