使用socket api编程问题(高分)

ui 2000-08-31 11:19:00
我现在使用socket api编程,工作在windows nt的C/S方式下,客户机发送文件用的transmitfile函数,服务器端循环接收,每次循环用select做轮询, 通过调试发现,每次可以接收4k-8k不等,即使把select超时值设为0,还是有不少数据为到达,浪费不少时间,发送3M多文件居然用了1分多时间。请问:在C/S结构下用何种方式传送大文件(size至少在10M以上)最快,用socket api编程又需要如何做才行。
...全文
225 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
flywhc 2000-09-11
  • 打赏
  • 举报
回复
为什么不用异步(非阻塞)模式?
在UNIX下也许因为传统的原因,都用SELECT做,因为UNIX多进程比较好。
可WINSOCK从一开始就提供异步模式,只有有数据的时候才收,否则就去
做其他事情,很节省资源,感觉就好象DOS时代的中断。
很多人喜欢用多线程、阻塞模式,这样很耗费资源,至少我的经验是如此,轮询就更不可取了。

传送文件更重于传送算法,不同的带宽传送算法也不同。不知道你是不是这样做的:
请求一个包->发送一个包->接收后再请求一个包...
一般来说不如这样:
请求一个包->发送一个包->过n毫秒再发下一个包->...(接收端一直不发请求,除非有
丢包错包)
包的大小和n的间隔很重要,不同的带宽不一样。记得原来有种ZMODEM算法,用于MODEM
传输,可以自动改变这些,基本思想大概是每成功接收N个包就把包的大小扩大一倍,有错包则减少一倍,调到稳定为止.

如果是局域网的话,我想最快的办法是把那个文件一次读入内存,再全send()出去 :)
killjapan05 2000-09-01
  • 打赏
  • 举报
回复
服务端在nt上也可用select()??
borz 2000-09-01
  • 打赏
  • 举报
回复
不到万不得已不要用轮询方式,你在客户端为什么不用几个线程来发送文件呢?然后在服务器端用线程接收,那样肯定会快点
playpcgame 2000-08-31
  • 打赏
  • 举报
回复
关注

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧