首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

VC++ Socket 移动设备通信时数据过滤

2013-03-10 
VC++ Socket 移动设备通讯时数据过滤本帖最后由 zhaoxiuyong 于 2013-03-05 17:18:47 编辑我现在做[u]一个

VC++ Socket 移动设备通讯时数据过滤
本帖最后由 zhaoxiuyong 于 2013-03-05 17:18:47 编辑 我现在做[u]一个服务器用C++做的,客户端用Android做的通讯程序。服务器使用的 NDK 2.0开发包。

    有一堆采集设备向服务器发送数据。服务器接收到数据后向移动设备转发。考虑到移动设备端处理能力和流量控制。服务器在向移动设备端发送数据时需要做过滤。移动设备端一时只显示一台采集设备的数据,其他采集设备的数据是没必要下发到移动设备端的。

    我在NDKUser类中增加了一个char数组用来保存移动设备端的识别号。当移动设备端切换显示采集设备时,发送设备识别号到服务器设置当前查看的是哪一台采集设备。服务器下发数据时根据这个设备识别号匹配是否需要下发到移动设备端。


NDKUser.h部分代码
    



//用户序号
long  m_lId;

//数据识别号
char m_simNO[12];

        //设置数据接收范围
void SetDataMatch(char lpBuf[]);

//设置是否进行数据过滤
void SetDataMatchState(BOOL isFilter);

//判断是否符合数据接收条件
BOOL CompArray(char arr2[]);



NDKUser.cpp部分代码

//设置接收数据范围
void CNDKUser::SetDataMatch(char lpBuf[])
{
dataLock.Lock();
while(!m_userDataQueue->empty())
{
m_userDataQueue->pop();
}
strcpy(m_simNO, lpBuf);//调试,设置之后再重新切换采集设备识别号时发现上次设置的值没有了
SetDataFilter(true);
dataLock.Unlock();
}

//设置是否进行数据过滤
void CNDKUser::SetDataMatchState(BOOL isFilter)
{
m_bFilter = isFilter;
}

//判断数组是否相同
BOOL CNDKUser::CompArray(char arr2[])
{
BOOL bResult = true;
dataLock.Lock();
for(int i=0;i<strlen(arr2);i++)
{
bResult = m_simNO[i]==arr2[i];//不管设置了什么识别号这里的m_simNO值始终是空的
if(!bResult)
break;
}
dataLock.Unlock();
return bResult;
}



NDKUserManager.h部分代码


////////////////////////////////////////////////////////////////////////////////
// Defines                                                                    //
////////////////////////////////////////////////////////////////////////////////
typedef CArray<long, long>                CLongArray;
typedef CList<CNDKUser, CNDKUser &>       CUserList;
typedef CList<long, long>                 CLongList;


NDKUserManager.cpp部分代码


// Adds a user then returns its new Id.
long CNDKUserManager::AddUser(CNDKServerSocket* pServerSocket)
{
m_lNextId++;

CNDKUser* user =new CNDKUser(m_lNextId, pServerSocket);
user->m_hwnd = m_hwnd;

if(m_bThreadSendData)
user->CreateThreadSendData();
m_users.AddTail(*user);
return m_lNextId;
}

//设置接收数据范围
void CNDKUserManager::SetDataMatch(long lUserId,char lpBuf[])
{
CNDKUser& user = GetUserFromId(lUserId);
if (user.GetId() > 0)
{
user.SetDataMatch(lpBuf);
}
}

////////////////////////////////////////////////////////////////////////////////


// Private Operations                                                         //
////////////////////////////////////////////////////////////////////////////////

// Gets a user from an Id.
CNDKUser CNDKUserManager::GetUserFromId(long lUserId) const
{
CNDKUser user;
POSITION pos = m_users.GetHeadPosition();

while (pos != NULL)
{
user = m_users.GetNext(pos);

if (user.GetId() == lUserId)
pos = NULL;
}

return user;
}

// Sends a message to all users. 下发数据到移动设备端
BOOL CNDKUserManager::SendMessageToAllUsers(CLongList& listIds, const void* lpBuf, int nBufLen,char simNO[12], int nFlags)
{
POSITION pos = m_users.GetHeadPosition();    

while (pos != NULL)
{
CNDKUser& user = m_users.GetNext(pos);
if(user.m_bFilter && user.CompArray(simNO)) //判断是否需要过虑数据,是否符合接收条件(采集设备识别号是否匹配)
{
if(m_bThreadSendData)
{
SENDDATA data;
data->data = lpBuf;
data->dataLen = nBufLen;

user.AddDataToQueue(data);
}
else
{
int i =0 ;
while(!user.SendMessage(lpBuf, nBufLen, nFlags) && i<3) //3次发送失败
{
i++;
}
if(i==3)
   listIds.AddTail(user.GetId()); //记录发送失败连接号
}
}
}

BOOL bResult = listIds.IsEmpty();

return bResult;
}



还有一个现象是我在调试CNDKUser::SetDataMatch(char lpBuf[])时查看this对象的地址与调试BOOL CNDKUser::CompArray(char arr2[])时this对象的地址不同

设置设备识别号之前(图1)
VC++ Socket 移动设备通信时数据过滤


设置设备识别号之后(图2)
VC++ Socket 移动设备通信时数据过滤



下发数据匹配识别号时(图3),user对象的地址与图1的不一致
VC++ Socket 移动设备通信时数据过滤 vc++ socket NDK?2.0 Android 通讯
[解决办法]
CNDKUser user是局部变量,如果要返回外边,你必须自己写copy contruct ,如果你不写,编译器会自动给你加一个,所以你得到的只是一个副本,而不是它本身。

热点排行