假如我有一个buffer用来接收远程主机发来的内容,如果只有一个远程主机发给我,那么这个缓冲区不会写错;但是如果两个主机同时给我发内容,我用这个缓冲区来接受就肯定会写错,请问这个问题该怎么解决??

解决方案 »

  1.   

    你是怎样处理多个远程主机连接的?该不是两个线程使用同一个buffer接受的吧?
      

  2.   

    不是的,我的数据接收都在一个接受线程里面,用一个static缓冲区来接收数据帧,每个数据由很多帧组成,如果两个主机同时有数据帧发给我,那么数据帧就会写错
      

  3.   

    使用临界区(CRITICAL SECTION)来保护全局变量。保证一个通讯任务在写缓存区的时候,另一个通讯任务无法获得写权限。具体可以在CSDN里搜索。
      

  4.   

    我自己的程序是在VC2005下的,大概就是这个样子://头文件
    #include <afxmt.h>//定义全局变量的地方static CCriticalSection ccsLock;
    static int iGlobal;//使用全局变量的地方ccsLock.Lock();
    iGlobal = ... ...
    ccsLock.Unlock();
      

  5.   

    谢谢fivecotton的代码,我的问题不是这样的,我可能表达的不是很详细,假如主机A和主机B都要给我发送一串数据帧,如果是主机A先发第一帧,那么我以后接受的数据应该都是主机A的,这样数据才会被正确解码,如果在我接受A主机发来的第二个数据帧后却接到了B主机发来的第一个数据帧,那么数据将被打乱!这两个主机发来的数据都会有错误(至少A是一定的),我的问题就在此,怎么协调两个或多个主机发来的数据帧?
      

  6.   

    怎么会这样?
    来自两台主机的数据是从两个不同的socket连接上过来的,还能区分不开?
      

  7.   

    最稳妥的方法当然是使用2个不同的接收缓存,但这肯定会让楼主做很多代码改动的工作。如果只能用1个缓存接,那么必须保证A的数据接完后才接B的数据。即:ccsLock.Lock(); 
    A任务写入,此时B任务无写权限;直到A接收完所有数据。
    ccsLock.Unlock();这很可能导致B的数据丢失……如果你采用的是UPD方式发送……如果使用TCP方式,如果接收一个完整数据的时间很长,这样做会降低效率,相当于A阻塞了B。在对时间响应要求比较高的场合不太适用。所以我建议尽量使用2个缓存接不同的数据……