yixiang2009a 2015-10-23 15:03 采纳率: 0%
浏览 1713

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个同样会出现这样的问题。传同样的文件夹,有时候能全部传完,有时候就只能传一半,而且出错的文件是随机的,不是固定的某个文件,导致调试异常困难,根本无法定位问题出现前的那个点……请问各位大神,此问题如何解决?

  • 写回答

2条回答 默认 最新

  • yixiang2009a 2015-10-24 15:12
    关注

    感谢各位回答,但是socket使用我是知道的,传输也没什么大问题,很多时候都可以正常传完,只有一定的几率会出错,所以我想知道为什么会出错,为什么会错开一个收发对。
    顺便提一下:通信过程中的连接,发送、接收什么的都是正常的,文件的打开、关闭之类的操作也都有,我把收发的缓存设置成和文件分片的大小一样还是会出错。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?