关于网友提出的“ sock发送文件的几点疑问?”问题疑问,本网通过在网上对“ sock发送文件的几点疑问?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: sock发送文件的几点疑问?
描述: 1、如果发送端用while(1)循环,也就不顾客户端的感受,拼命的发,进度条很快就完成了,但实际情况可能网络问题,客户端收得很慢,类似于QQ,它是用应答式交互,还是while(1)收发呢?
2、如果同时发三个文件(同时有进度),是不是要建立三个socket连接?三个线程分发呢?
3、发送以结构方式发数据,接收方有时“粘包”了,用什么方式把他们分开呢?最好能给点源码?
解决方案1: 用TCP的方式发送,采用应答式传输应该不会出现上面的问题,我传输文件也是用的TCP协议
解决方案2: 1、如果用WHILE(1)发的话,就像你所说的,会粘包,系统会将你发送的数据先放在缓冲区,然后到达一定大小时(好像是4K,记不太清楚)。一起发送出去。关于QQ,应该是应答方式,因为用的是TCP协议,TCP协议本身就是一种交互式T协议,如果数据不不想安全到达对方,会出错的。
2、最好建立三个连接,也可以三个进程共享同一个连接(我没做过,书上说可以,但不推荐使用)。
3、关于粘包现象有二种解决方法,一种是采用在尾部加分割符,别一种是方法可以让系统直接发送,设置如下:
服务器端的ONCONNECT消息中 加上以下代码:(这个消息自定义)
CMySock *clskt=new CMySock(this);
BOOL b=0;
clskt->SetSockOpt(TCP_NODELAY,&b,sizeof(BOOL),IPPROTO_TCP);
CMySock *(wparam)->Accept(*clskt);
解决方案3: 1.即使while(1)循环发送,也要按照接收方进度进行(看一下TCP的窗口机制--未能及时处理的数据在缓冲区填满后会禁制发送方数据传送的);
2.如果你的连接是1-1的,最好还是分先后传送;如果需要完成同步进行的话,要建立3个socket(其实效率并没有提高多少);
3.“粘包”问题可以先做好一个声明,比如每个独立数据传输完成,在末尾加"$",用这样的方式进行区分也可以处理“粘包”造成的影响.
解决方案4: 第3个问题我也碰到了,可是一直没有解决,郁闷呀
解决方案5: 楼上:解释很正确!
解决方案6: 1、腾讯没有说是应答方式还是WHILE发送.
2、要同时,也只好这样了.
3、.
以上介绍了“ sock发送文件的几点疑问?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3137356.html