本人正在写一个带有简单文件和文件夹传输功能的小程序,文件的传输一切正常,但是在传文件夹的时候,有一定几率会有某个文件的收发出现错位的现象,导致传输错误,代码大致如下:(缓冲区中的值我直接用含义代替了,实际前后还有很多代码,数据我是放到char数组中的)
服务端:(s为socket,buff为缓冲区)
发送文件夹(路径)
{
查找文件的循环,使用CFileFind,这里直接从找到某个文件开始,每个文件都会进入到下面的代码
if(path为目录)
{
send(s,0xffffffffffffffffLL,8,0);
recv(s,buff,1024,0);//这个接收只为同步,不传数据。
send(s,(char *)文件夹名称,strlen(文件夹名称)+1,0);
recv(s,buff,1024,0);//这个接收只为同步,不传数据。
发送文件夹(下一个路径)//递归调用
}
else
{
send(s,文件长度,8,0);
recv(s,buff,1024,0);//这个接收只为同步,不传数据。
send(s,(char *)文件名称,strlen(文件名称)+1,0);
recv(s,buff,1024,0);//这个接收只为同步,不传数据。
块=文件长度/4194304;//按4M大小分块
文件长度=文件长度%4194304;
for(i=0;i<块;i++)
{
读文件(内容,4194304);
send(s,内容,4194304,0);
recv(s,buff,1024,0);//这个接收只为同步,不传数据。
}
if(文件长度>0)
{
读文件(内容,文件长度);
}
send(s,内容,文件长度+1,0);
recv(s,buff,1024,0);//这个接收只为同步,不传数据。
}
文件查找结束后:
send(s,0xffffffffeeeeeeeeLL,8,0);
}
客户端:
while(1)
{
recv(s,buff,1024,0);
if(*((long long *)buff)==0xffffffffeeeeeeeeLL)
{
结束
}
else if(*((long long *)buff)==0xffffffffffffffffLL)
{
send(s,无用数据,4,0);//同步用
recv(s,buff,1024,0);
创建目录(buff);
send(s,无用数据,4,0);//同步用
}
else
{
文件长度=buff;
send(s,无用数据,4,0);//同步用
recv(s,buff,1024,0);
创建文件(buff);
块=文件长度/4194304;
文件长度=文件长度%4194304;
send(s,无用数据,4,0);//同步用
for(i=0;i<块;i++)
{
recv(s,内容,4194304,0);
写文件(内容);
send(s,无用数据,4,0);//同步用
}
recv(s,内容,文件长度+1,0);
if(文件长度>0)
{
写文件(内容);
}
send(s,无用数据,4,0);//同步用
}
}
以上就是大致的代码,文件的打开、关闭等操作均有。
在传输文件夹的时候,有时候会报错,调试跟进去发现是收发错开了一位,客户端把服务器发送的文件名当成了文件长度,把文件内容当成了文件名……然后创建文件失败,写入时报错。我觉得奇怪的就是为什么会错开一个收发对?我把文件夹的收发对做成3个同样会出现这样的问题。传同样的文件夹,有时候能全部传完,有时候就只能传一半,而且出错的文件是随机的,不是固定的某个文件,导致调试异常困难,根本无法定位问题出现前的那个点……请问各位大神,此问题如何解决?