socket文件传输功用的完成


这节我们来完成 socket 文件传输程序,这是一个十分适用的例子。要完成的功用为:client 从 server 下载一个文件并保管到当地。
编写这个程序需求留意两个成绩:
1) 文件巨细不肯定,有能够比缓冲区大许多,挪用一次 write()/send() 函数不克不及完成文件内容的发送。接纳数据时也会碰到异样的状况。
要处理这个成绩,可以运用 while 轮回,例如:关于 Server 端的代码,当读取到文件末尾,fread() 会前往 0,完毕轮回。
关于 Client 端代码,有一个症结的成绩,就是文件传输终了后让 recv() 前往 0,完毕 while 轮回。2) Client 端若何判别文件接纳终了,也就是下面提到的成绩——何时完毕 while 轮回。
最复杂的完毕 while 轮回的办法当然是文件接纳终了后让 recv() 函数前往 0,那么,若何让 recv() 前往 0 呢?recv() 前往 0 的独一机遇就是收到FIN包时。
FIN 包表现数据传输终了,盘算机收到 FIN 包后就晓得对方不会再向本人传输数据,当挪用 read()/recv() 函数时,假如缓冲区中没无数据,就会前往 0,表现读到了”socket文件的末尾“。
这里我们挪用 shutdown() 来发送FIN包:server 端直接挪用 close()/closesocket() 会使输入缓冲区中的数据生效,文件内容很有能够没有传输终了衔接就断开了,而挪用 shutdown() 会等候输入缓冲区中的数据传输终了。
本节以Windows为例演示文件传输功用,Linux与此相似,不再赘述。请看下面完好的代码。
效劳器端 server.cpp:
客户端代码:在D盘中预备好send.avi文件,先运转 server,再运转 client:
Input filename to save: D:recv.avi↙
//稍等少焉后
File transfer success!
翻开D盘就可以看到 r免费云主机域名ecv.avi,巨细和 send.avi 相反,可以正常播放。
留意 server.cpp 第42行代码,recv() 并没有接纳到 client 端的数据,当 client 端挪用 closesocket() 后,server 端会收到FIN包,recv() 就会前往,前面的代码持续履行。

相关推荐: for命令在dos和linux中的区别是什么

本篇内容主要讲解“for命令在dos和linux中的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“for命令在dos和linux中的区别是什么”吧! 区别:在dos中,该命令用于通过循环对文件组中的文件执…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/29 22:34
下一篇 01/29 22:34