用C实现断点续传的功能,详细点的实现原理是什么嘞

用C实现断点续传的功能,详细点的实现原理是什么嘞,第1张

用C实现断点续传的功能,详细点的实现原理是什么嘞

于HTTP 协议的多执行绪下载和断点续传的实现 学 生:叶升路 指导教师:覃 颖 (三峡大学 电气资讯学院) 摘 要:本文介绍了网路下载软体中的最新技术——多执行绪下载和断点续传技术,同时 也介绍了HTTP 协议的发展、特点以及WinSock 程式设计技术。

FTP客户端怎么样实现断点续传的功能?

上传的时候,如果档案已经存在,服务端会返回档案已经存在大小,根据这个大小,从本地档案读取这个大小之后的资料,进行断点续传

c# winform 中怎么利用wini实现断点续传?

WinI 提供对常用的网际网路协议,包括 Gopher、 FTP 和 HTTP 访问。使用 WinI,可以不必处理 WinSock、 TCP/IP 或特定的网际网路协议的详细资讯写入 Inter 客户端应用程式的程式设计中,更高的级别。

FTP 通常公开要将一个档案附加到另一个"追加"命令。WinI 不直接公开此功能。

在 Inter Explorer 3.0 和 4.0 中,这一问题的解决方法是从伺服器下载档案、 将附加到该客户端然后上载该档案备份到伺服器上。

从开始 Inter Explorer 5,FTP 命令可以直接传送到 FTP 伺服器使用 FtpCommand,如下所示:

CHAR szTemp[256]

wsprintf (szTemp, "APPE %s", "DestFile.txt")

bRet = FtpCommand( hConnection, WinI Connection handle

TRUE, Yes, I expect a response

FTP_TRANSFER_TYPE_ASCII, I'm receiving ASCII

szTemp, This is the FTP mand I am passing

0, No context needed

&hResponse)The handle to read the response

if (!bRet)

{

cout <<"FtpCommand failed, error: " <<GetLastError() <<endl

return

}

wsprintf (szTemp, "This data will be appended to the file")

DWORD dwSize

if (!InterWriteFile (hResponse, (LPVOID)szTemp, lstrlen(szTemp)+1, &dwSize))

{

cout <<"InterWriteFile failed, error: " <<GetLastError() <<endl

return

}

用swoole做websocket,怎么实现资料断点续传

在php的web控制器中,每当更新了资料库的资料库后,我需要将这些资料传送到其他使用者的客户端, 不知在web控制器中怎么实现这个一个目的,怎么才能swoole_websocket_server传送这些最新的资料。如果再建立一个 swoole_client话又感觉不好。

主轴定位功能的实现原理是什么

主轴定位指通过一个输出点控制主轴旋转到特定的位置以方便换刀或者主轴配合其它装置动作。

主轴定位是通过主轴伺服驱动模组内建的位置控制功能和检测主轴的位置编码器(可以安装在主轴上或者是主轴电机内建的编码器)来实现主轴定位的。

API有断点续传的功能吗?

有,可以通过HTML5 File api 实现断点续传。

一、实现档案多选

HTML5的<input>新增了"multiple"属性,该属性可接受多个值的档案上传栏位

<input type=file multiple="multiple" name="file"id="file">

添加了该属性使用者就可以在d出的对话方块中一次性选择多个档案了

二、实现档案从计算机拖拽到网页以及新增档案伫列功能

这里我们用 dragover 和 drop 两个事件来管理档案拖拽的功能

其中 dragover 用来处理在指定的元素上移动时的事件,这里我们通过给body系结dragover时间来处理页面中拖动档案的事件

document.body.addEventListener('dragover', dragFile,false) function dragFile(evt) { evt.sPropagation() evt.preventDefault() evt.dataTransfer.dropEffect = 'copy' }

用 drop 事件来处理滑鼠松开时候的事件,此时应该将使用者拖动过来的档案加入到上传伫列中,以供后续的处理

document.body.addEventListener('drop', dropFile,false) function dragFile(evt) { evt.sPropagation() evt.preventDefault() dataTransfer.files属性可以获取到所有拖动选择的档案,通过遍历可以读取到所有档案的资讯。 遍历每个档案可以获取到档案的 name、size、type、lastModifiedDate等关键资讯 var files = evt.dataTransfer.files addfile 方法 用来新增上传档案伫列,在input的change事件中也需要呼叫 该方法首先检查有无档案正在上传中,如果有就将后续加入的档案放到上传伫列中,如果没有档案正在上传就直接执行上传命令 addfile(files)

}

断点续传指的是在下载或上传时,将下载或上传任务(一个档案或一个压缩包)人为的划分为几个部分,每一个部分采用一个执行绪进行上传或下载,如果碰到网路故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。使用者可以节省时间,提高速度。

360浏览器如何实现断点续传

360安全浏览器内建下载工具是支援断点续传功能的,但是断点续传需要下载工具和下载资源相互支援配合才行。

所以,如果使用360se下载的档案无法断点续传的话,一般都是资源伺服器不支援断点续传功能。

部分下载网为了防止盗链是不允许断点续传的。

代理的实现原理是什么?

代理伺服器有很多种,大体分为三类:HTTP、FTP、SOCKS,其中又分为透明代理和不透明代理,透明代理一般是闸道器,为硬体

过程:

(1)客户端先和代理伺服器通讯,建立TCP连线,目的IP是代理伺服器的IP

(2)客户端发出GET命令,GET命令中包含URL或IP地址、明文

(3)代理伺服器将其中的URL转换为IP地址,可能会有DNS,将源资料包中的资料拷贝下来,去掉URL,重新组包再发出去

(4)代理伺服器和真实伺服器通讯,源IP是代理伺服器的IP

以上就是代理的实现原理,在我们日常生活中只有在学习IT才会了解哦,我也是在黑马程式设计师学习之后才了解的。

什么是ECMP?ECMP的实现原理是什么?

Linux 平台上之 Multipath Routing 应用

--------------------------------------------------------------------------------

撰稿/整理: Rex Tsai <chihchun@kalug.linux.>

HTML 版本:

:kalug.linux./sections.php?op=viewarticle&artid=4

TEXT 版本:

[Tips] Linux 平台上之 Multipath Routing 应用.

$Date: 2001/10/22 09:25:41 $

警告:

*****************************************************************************

您因使用或不能使用本文之教学而产生之任何软体、硬体损害(包括但不限

于直接或间接个人损害、营业利润之丧失、业务中断、营业资讯之遗失、或

任何其他金钱损失),概不负任何损害赔偿责任。

The author has taken care in the preparation of this paper, but

make no expressed or implied warranty of any kind and assume no

responsibility for errors or omissions. No liability is assumed for

incidental or consequential damages in connection with or arising

out of the use of the information or programs contained herein.

Linux is a registered trademark of Linus Torvalds. Other product

and pany names mentioned herein may be the trademarks of their

respective owners.

*****************************************************************************

撰稿/整理: Rex Tsai <chihchun@kalug.linux.>

此档案应有许多技术上得问题. 请熟悉的朋友来信指教.

[Introduction]

许多中小企业或是 Soho 甚至家庭, 会在家中装有一条以上宽频/宽频线路.

这篇 Tips 将介绍如何在 Linux 上, 好好的应用这些资源.

在你使用两家不同的 ISP 的时候, destination address-based load

balancing 将会是最好的解决方案. 你的封包可以即时透过不同的 ISP 线路

走出去. 当然这里所提的是从内部到外部, 如果你的专线提供不同的网路服

务提供给网路上得人存取, 那么接下来所说明的方式不适合您.

此篇文章只能提供内部网路对外的 load sharing.

以下文章以 GNU/Debian, Linux kernel 2.4.12, iproute-20001007-1 为

环境, 所有动作请在主机前面执行.

假设你有两条以上的网际网路资料线路 (xDSL, ISDN, Cable, whatever..),

想充分使用这些线路, 概观来看有三种方式

1. Multiplexing

2. Packet-wise load balancing

3. Destination address-based load balancing,

或称 Equal-Cost MultiPath Routing (ECMP)

稍微解释一下三种方式的不同

1. Multiplexing

Multiplexing, 这个方式提供某些路由器提供 offer-load balancing 或叫

做 load sharing. 这个方式可以让路由器将流量分给不同的外流 ports.

但是会造成每个 port 的传送上约有 30 % 的 overhead. 此外, 每家厂商的

实作都是独一的, 因次你会被锁在特定的解决方案上.

类似的技术是 "bonding" 或是 "multi-link". 这里所提得 Bonding 是一

个标准, 是由 Bandwidth on Demand Interoperability Group (一个大

概有四十个制造商的协会)所提. 已经提交给 American National Standards

Institute TR41.4 group. 这个通常的在于两条资料线路都是接在同一个

点(ISP)上的时候, 因此如果是两条不同 ISP 所提供的线路, 那么就没办法

达到这个目的. 当然, 如果你的 ISP 不提供此项技术服务, 那么也是没辙.

举个例子, 像是 stick multiple ISDN channels. 将几个慢速的线路合成为

快速的一条. 像是 ISDN H.221 规格即用到 inverse multiplexing. 但通常

用于视讯传输而不是电子资料.

2. Packet-wise load balancing:

这个在你可以得到所有的 ISP 协助的时候是可行的, 如果两家 ISP 都愿意

协助将其不同的路由器皆设定到同一个 IP 位址. 那么便可以这么作.

在这个方式中, 你会用到像是 sch_teql (the TEQL scheduler) 来创造一个

virtual device 将你的封包分散在不同的网路介面上.

一般来讲, 如果你是使用两家不同 ISP , 那么你不可以使用这个解决方案.

但, 你 "可以" 将所有的网路封包透过 IPIP or CIPE (Crypto IP Encapsu-

lation) 的方式来解决这个问题. 看看 Linux Kernel 中的 IP: tunneling.

3. Equal-Cost MultiPath:

在 Linux 核心中叫做 equal cost multipath (CONFIG_IP_ROUTE_MULTIPATH)

比较正确的说法应该是 "destination address-based load balancing". 一

般 Linux 想要为某个 IP 位址找到路由, 会因为效能的问题去查验暂存(cache)

中的资料, 如果目标 IP 并没有在暂存空间中, 那么他便会去查 routing table

来决定该 IP 位址的路由, 并将该路由放进 cache 中.

一般来讲核心中的路由功能只能为某个封包决定唯一的方向. 如果使用 ECMP 并

有机会让某个 package pattern 具有好几种不同的方向, 可以让某个符合路由条

件的封包透过 "equal" cost 或是自订的权重来选择该走的路由.

[Howto]

如果你有数台电脑想使用外部网路, 一条 ADSL 不够你使用(例如某人抓档太凶)

那么这是你正在找的解决方案. 你所能做的作好的方式就是每个 connection 可以

以 "non-deterministic fashion" 的方式选择路由, 将 connection 分散到不同的

Router 上, 注意: 这里所说的不是 packets, 这样 TCP/IP session 将无法连续.

但是这整个路由程式有两个部份四个问题要解决.

1a. How to get your packets to the outside world,

1b. How the outside world replies to you,

2a. How the outside world sends packets to you,

2b. How you reply to the outside world.

Multipath 可以解决 1a 出去的问题. 一般的路由设定可以解决 1b 与 2a. 而 2b

则必须使用 policy routing (multiple tables)才能解决, Multiple Tables 可以

让你加入以封包来源位址为依据来决定路由.

以下的范例, 在核心中, 务必加入编译以下选项

必备:

CONFIG_NETLINK=y

这个选项是 Kernel/User link socket

CONFIG_RTNETLINK=y

Routing messages

CONFIG_INET=y

TCP/IP neorking

CONFIG_IP_ADVANCED_ROUTER=y

IP: advanced router

CONFIG_IP_MULTIPLE_TABLES=y

IP: policy routing

CONFIG_IP_ROUTE_MULTIPATH=y

IP: equal cost multipath

选用:

CONFIG_IP_ROUTE_LARGE_TABLES=y

一般来讲 IP: large routing tables 也会勾选, 一方面 routing

zones 可以大于 64 笔, 这些资料存在 hash 资料结构中, 也可以

加速 "the routing process".

而 iproute 套件也是必须的软体. 这个软体的安装方式与位置请洽询提供

您所使用套件之厂商/组织. (Red Hat, Debian, Mandrake, SuSE, etc...)

重头戏来了, 这里假设你有三块网路卡, 分别给内部网路与两家 ISP. eth0

是内部网路, eth1 与 eth2 是其他两家 ISP 线路.

eth0 是内部网路, 范围是 10.0.0.0/255.255.255.0

eth1 其中一家 ISP, IP 是 1.1.1.1, 闸道器(gateway)是 1.1.1.253

eth2 另外一家 ISP, IP 是 2.2.2.2, 闸道器(gateway)是 2.2.2.253

# 列出所有的 rule

ip rule list

# table 后的 "10" 是 table identifer, 为数字.

# 注: 可用英文代称取代请看 /etc/iproute2/rt_tables

#

# table 10 是给在 gateway 后面的内部网路使用, 10.0.0.x 是 LAN 使用的 IP.

#

# pref 后面指定的 "10" 是 priority. 为 policy routing database 搜寻的次序

ip rule add pref 10 to 10.0.0.0/24 table 10

ip route add 10.0.0.0/24 table 10 dev eth1

# table 20 给 ISP #1, IP 1.1.1.1, gateway 1.1.1.253

# pref 后面指定的 "20" 是 priority. 为 policy routing database 搜寻的次序

ip rule add pref 20 from 1.1.1.1 table 20

ip route add default table 20 via 1.1.1.253

# table 30 is for ISP #2, IP 2.2.2.2, gateway 2.2.2.253

ip rule add pref 20 from 2.2.2.2 table 30

ip route add default table 30 via 2.2.2.253

# 列出所有的 rule

ip rule list

# 列出 table 10 的 rule

ip route list table 10

# 列出 table 20 的 rule

ip route list table 20

# If your ISP's have servers that authenticate by originating IP address,

# (e.g. SMTP or NNTP servers) you will want to explicitly list them here.

# 这里是静态的 routing table 设定. 如果你的 ISP 有提供某些网路服务, 必须该

# ISP 的 IP 才能使用, 那么你会想将它设定在这里

# (e.g. Proxy, SMTP or NNTP Server)

ip route add 1.1.1.0/24 dev eth1

ip route add 2.2.2.0/24 dev eth2

# 如果上面所有的 routing table 都没有吻合, 那么封包会走 default route

# 这里使用 "ECMP" 来选择上游路由器.

# "ip route repleace" 是用来取代原本的 default routi.

ip route replace default nexthop via 1.1.1.253 dev eth1 \

nexthop via 2.2.253 dev eth2

# 如果你想加上权重, 是这样使用的. 请依据你的线路网路频宽

# 频宽越大, 请把 weight 加大.

#ip route replace default nexthop via 1.1.1.253 dev eth1 weight 1 \

# nexthop via 2.2.253 dev eth2 weight 3

# Make it all happen. IMPORTANT! The above mands do NOT

# flush the route cache!

ip route flush cache

<-- 结束 -->

Linux 上得 ECMP implementation 的实作有一个特色, 当你的上游网路介面

使用 ARP (e.g. 使用传统 IP-over-Ether)时, 如果其中一个网路介面阵

亡时, Linux kernel 会自动把该介面 "shutdown", 并停止那些需要经过该

介面的 "nexthops". 但是要附注一提的是, 如果你使用的是 "网路型" ADSL

服务, 你会取得一个 ADSL 路由器, 你可能会架设一个 NAT 伺服器与 ADSL

路由器放在同一个 Ether Hub 上, 如果这个时候 ADSL 断线, 但是 Hub

并未断线, Linux 会认为该网路卡仍在 on-line 状态. 除非是该 hub 或是网

路卡故障, kernel 才会 shutdown 该网路介面.

因此如果你需要确实的 "failover", 请动手写一个小 script, 定时用 ping

或称 "icmp echo request" 来询问 ISP 端的闸道器是否正常的运作, 并用

"ip route replace" 来置换那些确定可通的路由. 这里就请您自行处理了.

Enjoy it, Rex.

[Reference]

[1] Linux-Net mailing list. :uwsg.iu.edu/hypermail/linux//

原文 :uwsg.iu.edu/hypermail/linux//0107.3/0028.

[2] Alexey N. Kuzsov, April 14, 1999, IP Command Reference

[Futrher reading]

[1] Jack Coates , Load-Balancing on LRP HOWTO

[2] Netherlabs BV (bert hubert ),

Gregory Maxwell ,

Remco van Mook ,

Martijn van Oosterhout ,

Paul B Schroeder ,

Jasper Spaans , howto@ds9a.nl,

Linux 2.4 Advanced Routing Howto

[3] Horacio J. Pe?a, horape@pendium..ar, 05/Apr/2000

Policy based routing MICRO-HOWTO,

:pendium..ar/policy-routing.txt

[Keywords]

Linux, Routeing, 路由, ADSL, 宽频, 宽频, 频宽, 合并, 分流, 共用

[Acknowledgements]

Zygo Blaxell (zblaxell@furryterror.) 在 Linux- 的说明

Digital Sesame, Inc - :d11e. 提供环境测试.

--

Best Regards.

Rex Tsai <chihchun_at_kalug.linux.>

--

ThinkPHP 的 C 函式实现原理是什么?

c方法里面有个静态变数,每次初始化的时候就把配置赋值给这个静态变数,然后每次使用的时候就直接在这个静态变数里获取了,楼主应该知道静态变数在整个执行期间都存在吧

断点续传一般是把文件分成固定大小的包,比如128字节为1个包,然后客户端记录下传了多少个完整的包,断了以后,下次再连接的时候直接请求从前一个包那里传。

批量传输,把整个要传输的文件分成N个部分,然后启动N个线程,每个线程负责下载1部分。这样就达到充分利用网络带宽了。

没有看到具体的程序和出错信息,不太好判断。但是根据字符串长度:

len = 109746785321345

来看。这么长的“字符串长度”通常有2种可能:

是一个(可能不是很大的)负数;

程序内存出错,引用了一段非法的地址,导致读取了错误的字符串长度。

你可以根据实际的情况,看看具体是哪种情况。从你描述的:“客户端退出再重新进行”就不会出错的情况看,有可能是在执行“续传”的相关代码出现了“没有初始化就使用”的变量,或者引用已经free掉的无效内存块的情况。

查查看,有情况继续交流,谢谢。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11695141.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存