首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

TCP发送文件解决思路

2014-01-14 
TCP发送文件我做的一个最简单的一个程序,就是服务器端像客户端发送文件客户端接收会出错,而且这种出错是这

TCP发送文件
我做的一个最简单的一个程序,就是服务器端像客户端发送文件
客户端接收会出错,而且这种出错是这样子的,只要发送过快就会出错。如果发送端sleep一下的话,则不会出现这种情况。如果sleep的时间很少也是会出现这种情况?我觉得这是很容易遇到的问题,但是为什么我就没有搜到答案呢?还是大家都没遇到这个问题?我的源码在这里
server,filename是文件信息,NET_PACK是自己定义的包,包括帧号信息等。

        NET_PACK lppack;
lppack.m_nSize=3*sizeof(WORD)+sizeof(filename);
for(int i=0;i<100;i++){
lppack.m_nSeque = i;
printf("seq:%d\n",i);
memcpy(lppack.m_buffer,filename,sizeof(filename));
send(sClient,(char*)&lppack,lppack.m_nSize,0);

/*Sleep(5);*/
}


client

while(ret>0){
ret = recv(sclient, recData, 8196, 0);
if(ret > 0)
{
LPNET_PACK pack = (LPNET_PACK)recData;
printf("ret:%d\t%s\n",pack->m_nSeque,pack->m_buffer);
//fwrite(pack->m_buffer,pack->m_nSize,1,fp);
}
}


这是什么情况呢?
[解决办法]
还没有看代码,不过按照你说的现象,像是TCP粘包
[解决办法]
引用:
Quote: 引用:

你循环发tcp也不能处理了,你看下send的返回值了吗

发送是没问题的,因为send的返回值我都打印出来了,而且就是感觉是这样,服务器端一股脑的把数据丢出去了,然后客户端收的时候出了问题。谢谢你的回答

send 返回值仅仅是说已经交给TCP发送了,至于发送成功并不知道。没有明白你说的没有缓冲区了。我理解的你的意思是,每send一次都让他立即发送,不等其他的流一起发送。但是接收端也是有接收缓冲区的,按照协议,接收端会通知自己的缓冲区还有多大,也就是窗口还有多大。所以接收端缓冲区满了的时候,server发送端TCP就会等待,发送端的缓冲区在等待的过程中也会填满。这样就导致发送的数据不全。
[解决办法]
你有没有考虑到粘包呢?
你的情况一看, 基本上就是拆包和粘包的问题.

发送的时候, 由于发送很快, 系统会自动把数据组合起来一起发送. 所以完全有可能3.5个包,或者8.2个包发出去了, 而你接收是按整数个接收, 最后收到的肯定就是有问题的了. 因为每次发送的并不一定是整数个包.
注: 我这里的"包",是指的你的 NET_PACK.

这时你的接收端就需要注意组包, 每次接收都要判断接收到的数据长度, 如果未达到一个完整包, 则要继续接收剩下的部分.
如果你接收缓冲区很大, 可以容纳几个NET_PACK的话, 就还要考虑拆包.  (你这里一次只接收一个, 不用考虑)

热点排行