本人正在写一个文件上传的程序,模拟http协议实现文件上传。 我的实现机制是客户端每次发送一个文件块1K大小,然后sleep(10),当发送50个包后,如果服务端接收没问题,则回应一个包,客户端收到这个包后,则继续发下50个包。当网络状况较好的时候,server 和 client 收发都没什么问题,但是当网络比较慢,延时达到200ms以上时,则出现问题,接收文件的时候就会出错,总是提示收到的数据与要求的数据不服,要求客户端重传。调试了很久,不知原因在哪里。(我也改成传一个包回应一次,老问题依然出现)
自己的疑问是:1、网络慢会对接收方造成什么样的影响,会影响tcp的包的重组和socket缓冲区里面包的顺序吗?
2、当客户端send一批数据,是怎样往服务端的socket 缓冲区写入?谢谢指教!!!
自己的疑问是:1、网络慢会对接收方造成什么样的影响,会影响tcp的包的重组和socket缓冲区里面包的顺序吗?
2、当客户端send一批数据,是怎样往服务端的socket 缓冲区写入?谢谢指教!!!
解决方案 »
- 请教: 使用SetUnhandledExceptionFilter注册的过滤器回调未被调用的问题
- 基于对话框的 一个编辑框中绘图?
- 连接时候出现这个问题怎么解决呀 谢谢
- 许多人提出用GETCHUNK()及APPANDCHUNK()处理Binary数据,其实根本不行。
- 各位大侠,如何开发一个能嵌入Add-ins的宿主程序(即让自己的程序支持Add-ins)?
- 急急急~~~急到腿都软了:$高手救命!!!
- 那位兄弟有imgedit.ocx控件,能否给个我。
- 请各位高手解释一小段程序.
- 急求com服务器和客户端示例源码
- 并口通讯的问题
- installshield获取程序安装路径
- 菜鸟提问_请问在使用VC真正开发时用不用自己设一些编译选项啊?
-- Four ways to speed up your network applications
http://www-128.ibm.com/developerworks/linux/library/l-hisock.html
问题不是出在网络延迟
而是你的发送或者接收代码容错存在问题
检查你的代码中的发送和接受部分,是否确实检查了每一次发送的返回值并进行了处理
TCP连接不会出现你说的这种问题
与网络无关
但是网络速度慢会造成包的丢失和不完整吗?
在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
是用异步还是同步?
看你的描述和相关
象是使用阻塞
那么你就应该一次性不要发送和接收那么多数据
发送端 send->其实是首先发到本地缓冲,然后有TCP/IP将缓冲中数据组合成TCP包,通过IP层[IP包]发送到目的地
接受端 RECV-》同样是读本地缓冲,
在阻塞模式下,你一次发送太多的数据,例如好几M,遇到网络不好的情况就会出现发送或者接收失败
默认情况下,你调用的SEND的TCP默认超时时间大概是几百秒这样,如果超过这是时间,还没有被完全发送或者接收
就认为网络出问题,返回失败
所以阻塞模式下,一次性发送的包不要太大,建议改用非阻塞或者异步
tcp是流数据,不像UDP一样一个一个包的,TCP做应用协议的话需要加包头什么的封装。
你这个至少也要判断一下一次接收的返回值,可能不到1k,够一k了再校验。
偶也遇到了网络断了自动互连的问题 现在解决了
唉 学mfc之前最好先学sdk 要不连些概念都搞不明白 mfc老多默认 呵呵
我采用的是事件选择模型,但是在接收数据的时候,使用的是recv(socket,&ch,1,0),在这个时候,总是出现接收失败,返回SOCKET_ERROR的错误,产生的错误原因是由于要接收数据的缓冲区中没有数据(这是由于网络太慢,还有部分数据没有传到造成的),所以我在此就设定一个sleep(10),等会儿再取,如果还没取道,再循环,一直等到有数据为止。这可能是解决网络慢的一个很笨的方法。看到上面5、6楼的提示,是否可以用setsockopt函数实现循环sleep的功能呢?
还有,就是我对阻塞和非阻塞还是比较迷茫,请大家赐教。
阻塞模式就是让线程阻塞 直到接收结束 一般开单独的接收线程 用阻塞模式
非阻塞本线程继续运行 让当数据到了buffer时 发出一个Notification 进入OnReceive() 做处理 一般在只有一个主线程时用这种方式