socket通信收发错位的问题

问题描述

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

socket通信收发错位的问题的相关文章

socket-Android Socket通信一样的代买两个Demo为啥 有一个可以用另一个不行?

问题描述 Android Socket通信一样的代买两个Demo为啥 有一个可以用另一个不行? 就是第一socket通信做成了之后我用第二个复制第一个,然后就不能用了. 很简单的demo就是socket通信收发,网上很多例子. 两个都添加了 INTERNET使用权限 解决方案 为啥要复制呢?也可能是只能运行一个呢 解决方案二: IP写对了,还有接收和发送两个端口

服务器与客户端用socket通信 第一个页面实现服务器连接,第二个页面实现收发数据

问题描述 服务器与客户端用socket通信 第一个页面实现服务器连接,第二个页面实现收发数据 各位大神,我在制作一个简单的app,服务器与客户端用socket通信的 ,现能在单个页面实现连接服务器和收发数据,现在想分开来做,第一个页面实现服务器连接,第二个页面实现收发数据,有什么好的建议吗? 蟹蟹大家了.

客户端和服务端通过建立socket通信,协议是tcp/ip

问题描述 客户端和服务端通过建立socket通信,协议是tcp/ip 有一个问题咨询:一个客户端和一个服务端通过tcp/ip连接(之间建立socket通信),在不断网的情况下,服务端关闭,客户端报警,重新开启服务器,客户端能够重新连接上服务端,但是如果拔掉网线,客户端就连接不上服务端了,但从服务端发送过来的数据还是可以读到,可是从客户端发送的数据不能到达服务端,这是为什么??? 解决方案 TCP的客户端和服务端通信socket 客户端和服务端的TCP基本通信简单的Socket通信客户端和服务端

java-Android系统socket通信字节乱码。

问题描述 Android系统socket通信字节乱码. 编写了android socket通信的软件,可以和主机通讯互相收发数据.但是一个字节的数据超过0x80就会乱码,也就是说如果数据小于128,那么正常超过就会乱码.请问这是哪里有问题.我确认硬件没有问题,换了设备也是可以的. public class Tcp40Activity extends Activity { /** Called when the activity is first created. */ Button BnSend

android socket通信读取图片数据,数据出错

问题描述 android socket通信读取图片数据,数据出错 我从电脑服务端用imageIO发送了屏幕的截图给android,android端发现如果每次读取 的数据大小超过20K,所得的数据就会出错,我对比了下发送前的图片数据,基本上是 夹杂了很多1K以上的0数据块,又或者是数据块错位.但是一旦把每次读取的数据大小降 低至10K以下又或者增加两次读取间的间隔至500ms以上就能保持数据不出错,这是为什 么呢? 解决方案 Android中的Http通信(二)之根据Url读取网络数据 解决方案

关于socket通信,先打开客户端再连接上信号没反应的问题

问题描述 采用的wifi模块,通过socket通信建立连接,可是必须先连上信号再打开客户端才可以实现数据收发,当连接断开不关闭客户端,再重新连上wifi信号就不能进行数据传输了,请教各位大神这是怎么回事呢? 解决方案 解决方案二:这取决于你自己的程序怎么写的啊.wifi断了,就是你的socket已经断了,要重连的.解决方案三:这里你要做一个判断,你以前的思路是打开客户端就直接进行socket连接尝试,如果不成功就不管了.改成打开客户端先判断wifi是否连接,是否可以访问万维网,如果能访问则建立s

socket 通信 多线程调用窗体(委托)的几个知识点,记录在案,以备查阅

1.socket 通信传输汉字的方法:Encoding.GetEncoding("GB2312").GetString(Receivebyte) 发送接收都这样转化 直接上程序   public partial class Form1 : Form { public Form1() { InitializeComponent(); } //定义委托 public delegate void ShowMessageHandel(string msg); //向控件添加显示信息 publi

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍      在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA中间Socket/Tcp框架进行了总体的介绍,我们知道 AgileEAS.NET SOA中间件Socket/Tcp框架是一套Socket通信的消息中间件: 二.简单例子-实现简单的服务器客户段消息应答      我们接下来实现一个简单的例子,例子的场景非常的简单,客户端向服务端发送一个请求

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

一.前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的.      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC.ORM.SOA.分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的