问题描述
- socket通信收发错位的问题
-
本人正在写一个带有简单文件和文件夹传输功能的小程序,文件的传输一切正常,但是在传文件夹的时候,有一定几率会有某个文件的收发出现错位的现象,导致传输错误,代码大致如下:(缓冲区中的值我直接用含义代替了,实际前后还有很多代码,数据我是放到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个同样会出现这样的问题。传同样的文件夹,有时候能全部传完,有时候就只能传一半,而且出错的文件是随机的,不是固定的某个文件,导致调试异常困难,根本无法定位问题出现前的那个点……请问各位大神,此问题如何解决?
解决方案
http://blog.csdn.net/heyutao007/article/details/6588302
解决方案二:
socket通信问题
Socket通信中碰到的链接问题
java socket 与linux c通信问题
解决方案三:
感谢各位回答,但是socket使用我是知道的,传输也没什么大问题,很多时候都可以正常传完,只有一定的几率会出错,所以我想知道为什么会出错,为什么会错开一个收发对。
顺便提一下:通信过程中的连接,发送、接收什么的都是正常的,文件的打开、关闭之类的操作也都有,我把收发的缓存设置成和文件分片的大小一样还是会出错。
时间: 2024-09-15 09:29:47