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粘包
[解决办法]send 返回值仅仅是说已经交给TCP发送了,至于发送成功并不知道。没有明白你说的没有缓冲区了。我理解的你的意思是,每send一次都让他立即发送,不等其他的流一起发送。但是接收端也是有接收缓冲区的,按照协议,接收端会通知自己的缓冲区还有多大,也就是窗口还有多大。所以接收端缓冲区满了的时候,server发送端TCP就会等待,发送端的缓冲区在等待的过程中也会填满。这样就导致发送的数据不全。
[解决办法]你有没有考虑到粘包呢?
你的情况一看, 基本上就是拆包和粘包的问题.
发送的时候, 由于发送很快, 系统会自动把数据组合起来一起发送. 所以完全有可能3.5个包,或者8.2个包发出去了, 而你接收是按整数个接收, 最后收到的肯定就是有问题的了. 因为每次发送的并不一定是整数个包.
注: 我这里的"包",是指的你的 NET_PACK.
这时你的接收端就需要注意组包, 每次接收都要判断接收到的数据长度, 如果未达到一个完整包, 则要继续接收剩下的部分.
如果你接收缓冲区很大, 可以容纳几个NET_PACK的话, 就还要考虑拆包. (你这里一次只接收一个, 不用考虑)