socket接收文本时缓冲区写错误怎么办?? 假如我有一个buffer用来接收远程主机发来的内容,如果只有一个远程主机发给我,那么这个缓冲区不会写错;但是如果两个主机同时给我发内容,我用这个缓冲区来接受就肯定会写错,请问这个问题该怎么解决?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是怎样处理多个远程主机连接的?该不是两个线程使用同一个buffer接受的吧? 不是的,我的数据接收都在一个接受线程里面,用一个static缓冲区来接收数据帧,每个数据由很多帧组成,如果两个主机同时有数据帧发给我,那么数据帧就会写错 使用临界区(CRITICAL SECTION)来保护全局变量。保证一个通讯任务在写缓存区的时候,另一个通讯任务无法获得写权限。具体可以在CSDN里搜索。 我自己的程序是在VC2005下的,大概就是这个样子://头文件#include <afxmt.h>//定义全局变量的地方static CCriticalSection ccsLock;static int iGlobal;//使用全局变量的地方ccsLock.Lock();iGlobal = ... ...ccsLock.Unlock(); 谢谢fivecotton的代码,我的问题不是这样的,我可能表达的不是很详细,假如主机A和主机B都要给我发送一串数据帧,如果是主机A先发第一帧,那么我以后接受的数据应该都是主机A的,这样数据才会被正确解码,如果在我接受A主机发来的第二个数据帧后却接到了B主机发来的第一个数据帧,那么数据将被打乱!这两个主机发来的数据都会有错误(至少A是一定的),我的问题就在此,怎么协调两个或多个主机发来的数据帧? 怎么会这样?来自两台主机的数据是从两个不同的socket连接上过来的,还能区分不开? 最稳妥的方法当然是使用2个不同的接收缓存,但这肯定会让楼主做很多代码改动的工作。如果只能用1个缓存接,那么必须保证A的数据接完后才接B的数据。即:ccsLock.Lock(); A任务写入,此时B任务无写权限;直到A接收完所有数据。ccsLock.Unlock();这很可能导致B的数据丢失……如果你采用的是UPD方式发送……如果使用TCP方式,如果接收一个完整数据的时间很长,这样做会降低效率,相当于A阻塞了B。在对时间响应要求比较高的场合不太适用。所以我建议尽量使用2个缓存接不同的数据…… API获取打印机注册表路径 如何使用DLL来封装ActiveX控件(类似任务管理器画图的控件) 帮帮忙!!动态创建的控件不显示 用树结构浏览zip文件的内容 新手弱问:如何把一个工程已编辑好的对话框资源导入另外一个工程? vc到底该怎么学 什么是 GIS 啊? 关于虚函数使用的一点困惑,麻烦各位大虾帮忙解疑!!! 深入浅出MFC真能算一本好书么 用vc写的程序在没有安装vc的电脑上功能不全 RegOpenKeyEx和根注册表的问题 vc 调用C#
#include <afxmt.h>//定义全局变量的地方static CCriticalSection ccsLock;
static int iGlobal;//使用全局变量的地方ccsLock.Lock();
iGlobal = ... ...
ccsLock.Unlock();
来自两台主机的数据是从两个不同的socket连接上过来的,还能区分不开?
A任务写入,此时B任务无写权限;直到A接收完所有数据。
ccsLock.Unlock();这很可能导致B的数据丢失……如果你采用的是UPD方式发送……如果使用TCP方式,如果接收一个完整数据的时间很长,这样做会降低效率,相当于A阻塞了B。在对时间响应要求比较高的场合不太适用。所以我建议尽量使用2个缓存接不同的数据……