📄 recvdata.cpp
字号:
// 处理客户请求的线程函数 //
#include "stdafx.h"
#include "common.h"
#include "msg.h"
#include "Server.h"
#include "MainFrm.h"
#include "ServerView.h"
UINT ProcessRecvData(LPVOID param)
{
CData* pData=(CData*)param;
UINT index=pData->index;
CServerApp * pApp=(CServerApp*)AfxGetApp();
CMainFrame* pMainWnd=(CMainFrame*)(pApp->m_pMainWnd);
CServerView *pView=(CServerView*)(pMainWnd->GetActiveView());
UserOnline * pUsers=pApp->m_pUsers;
CDatabase * pDatabase=&pApp->m_Database;
CServerSocket * pSocket=&pApp->m_Socket;
::InterlockedIncrement((long*)&pApp->m_nRecvMsg);
switch(index)
{
case ONHIDE:
{
int pIndex=pData->MyId-UserIdRadix;
if(pIndex>=0&&pIndex<pApp->m_nTotalUserNumber) // true means it esxit
{
if(pUsers[pIndex].State==0||pUsers[pIndex].State==1)
{
CData mc;
mc.index=ONHIDE_OK;
mc.MyId=pData->MyId;
mc.tarIP=pData->tarIP;
mc.nPort=pData->nPort;
mc.wIndex=pData->wIndex;
if(!pSocket->SendData(&mc))break;
if(pUsers[pIndex].State==0)
{
//找出我的朋友
CRecordset recordset(pDatabase);
CString mysql;
mysql.Format("select FriendId from Friends where MyId=%d",pUsers[pIndex].Id);
recordset.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CDBVariant value;
CArray<DWORD,DWORD>pFriendId;
while(!recordset.IsEOF())
{
recordset.GetFieldValue(short(0),value);
pFriendId.Add(value.m_lVal);
recordset.MoveNext();
}
recordset.Close();
// 发送好友列表给用户
CMsg2 msg;
msg.index=ALL_FRIEND_ID;
msg.wIndex=pData->wIndex;
msg.tarIP=pData->tarIP;
msg.nPort=pData->nPort;
msg.MyId=pData->MyId;
msg.aFriendId.Append(pFriendId);
if(!pSocket->SendData(&msg))break;
// 发送在线好友给用户
CMsgOnlineFriend msg1;
msg1.index=ONLINE_FRIEND;
msg1.wIndex=pData->wIndex;
msg1.tarIP=pData->tarIP;
msg1.nPort=pData->nPort;
msg1.MyId=pData->MyId;
for(int i=0;i<pFriendId.GetSize();i++)
{
int pi=pFriendId.GetAt(i)-UserIdRadix;
if(pUsers[pi].State)
{
msg1.aFriendId.Add(pUsers[pi].Id);
msg1.aFriendIP.Add(pUsers[pi].IP);
msg1.aFriendPort.Add(pUsers[pi].Port);
msg1.aFriendState.Add(pUsers[pi].State);
}
}
Sleep(500);
if(!pSocket->SendData(&msg1))break;
//发送离线广播消息
mysql.Format("select broadcast.SendTime,broadcast.SenderId,broadcast.msg,offbroadcast.num from broadcast,offbroadcast where offbroadcast.msgid=broadcast.msgid and offbroadcast.RecvId=%d",pData->MyId);
CRecordset rs(pDatabase);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CMsg1 msg3;
CDBVariant s1;
msg3.tarIP=pData->tarIP;
msg3.nPort=pData->nPort;
msg3.index=SYSTEM_BROADCAST;
msg3.wIndex=pData->wIndex;
msg3.FriendId=pData->MyId;
while(!rs.IsEOF())
{
rs.GetFieldValue(short(0),s1);
msg3.Time=s1.m_lVal;
rs.GetFieldValue(1,s1);
msg3.MyId=s1.m_lVal;
rs.GetFieldValue(2,msg3.Msg);
rs.GetFieldValue(3,s1);
int inum=0;
inum=s1.m_lVal;
Sleep(500);
if(pSocket->SendData(&msg3))
{
CString sql1;
sql1.Format("delete from offbroadcast where num=%d",inum);
pDatabase->ExecuteSQL(sql1);
}
else
{
rs.Close();
goto proc_end;
}
rs.MoveNext();
}
rs.Close();
//发送离线消息
mysql.Format("select * from offmsg where RecvId=%d",pData->MyId);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CMsg1 offmsg3;
CDBVariant dbMsgId,dbSenderId,dbRecvId,dbRecvTime,dbmIndex;
offmsg3.tarIP=pData->tarIP;
offmsg3.nPort=pData->nPort;
offmsg3.FriendId=pData->MyId;
offmsg3.wIndex=pData->wIndex;
while(!rs.IsEOF())
{
rs.GetFieldValue("MsgId",dbMsgId);
rs.GetFieldValue("SenderId",dbSenderId);
rs.GetFieldValue("RecvId",dbRecvId);
rs.GetFieldValue("RecvTime",dbRecvTime);
rs.GetFieldValue("mIndex",dbmIndex);
rs.GetFieldValue("Msg",offmsg3.Msg);
offmsg3.MyId=dbSenderId.m_lVal;
offmsg3.Time=dbRecvTime.m_lVal;
offmsg3.index=dbmIndex.m_chVal;
int inum=0;
inum=dbMsgId.m_lVal;
Sleep(500);
if(pSocket->SendData(&offmsg3))
{
CString sql1;
sql1.Format("delete from offmsg where MsgID=%d",inum);
pDatabase->ExecuteSQL(sql1);
}
else
{
rs.Close();
goto proc_end;
}
rs.MoveNext();
}
rs.Close();
pUsers[pIndex].IP=pData->tarIP;
pUsers[pIndex].Port=pData->nPort;
::InterlockedIncrement((LPLONG)&pApp->m_nNumberOnline);
}
pUsers[pIndex].State=2;
//找出把我当为好友的人,给其中在线或隐身的人发送我的隐身消息
CRecordset recordset(pDatabase);
CString mysql;
mysql.Format("select MyId from Friends where FriendId=%d",pUsers[pIndex].Id);
recordset.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CDBVariant value;
CNoticeMsg msg;
msg.index=SOMEONE_ONHIDE;
msg.MyId=pData->MyId;
msg.IP=pData->tarIP;
msg.Port=pData->nPort;
while(!recordset.IsEOF())
{
recordset.GetFieldValue(short(0),value);
int pi=value.m_lVal-UserIdRadix;
if(pUsers[pi].State)
{
msg.tarIP=pUsers[pi].IP;
msg.nPort=pUsers[pi].Port;
pSocket->SendData(&msg);
}
recordset.MoveNext();
}
recordset.Close();
}
CString str;
in_addr tIP;
tIP.S_un.S_addr=pData->tarIP;
str.Format("ID: %d 隐身登陆,IP: %s,Port: %d",pData->MyId,inet_ntoa(tIP),pData->nPort);
#ifdef _DEBUG
pView->ShowMessage(str);
#endif
}
else
{
CString str;
str.Format("ID: %d A Invalid ID",pData->MyId);
#ifdef _DEBUG
pView->ShowMessage(str);
#endif
}
break;
}
case ONLINE:
{
int pIndex=pData->MyId-UserIdRadix;
if(pIndex>=0&&pIndex<pApp->m_nTotalUserNumber) // true means it esxit
{
if(pUsers[pIndex].State==0||pUsers[pIndex].State==2)
{
CData mc;
mc.index=ONLINE_OK;
mc.wIndex=pData->wIndex;
mc.MyId=pData->MyId;
mc.tarIP=pData->tarIP;
mc.nPort=pData->nPort;
if(!pSocket->SendData(&mc))break;
if(pUsers[pIndex].State==0)
{
CRecordset recordset(pDatabase);
CString mysql;
mysql.Format("select FriendId from Friends where MyId=%d",pUsers[pIndex].Id);
recordset.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CDBVariant value;
CArray<DWORD,DWORD>pFriendId;
while(!recordset.IsEOF())
{
recordset.GetFieldValue(short(0),value);
pFriendId.Add(value.m_lVal);
recordset.MoveNext();
}
recordset.Close();
// 发送好友列表给用户
CMsg2 msg;
msg.index=ALL_FRIEND_ID;
msg.wIndex=pData->wIndex;
msg.tarIP=pData->tarIP;
msg.nPort=pData->nPort;
msg.MyId=pData->MyId;
msg.aFriendId.Append(pFriendId);
if(!pSocket->SendData(&msg))break;
// 发送在线好友给用户
CMsgOnlineFriend msg1;
msg1.index=ONLINE_FRIEND;
msg1.wIndex=pData->wIndex;
msg1.tarIP=pData->tarIP;
msg1.nPort=pData->nPort;
msg1.MyId=pData->MyId;
for(int i=0;i<pFriendId.GetSize();i++)
{
int pi=pFriendId.GetAt(i)-UserIdRadix;
if(pUsers[pi].State)
{
msg1.aFriendId.Add(pUsers[pi].Id);
msg1.aFriendIP.Add(pUsers[pi].IP);
msg1.aFriendPort.Add(pUsers[pi].Port);
msg1.aFriendState.Add(pUsers[pi].State);
}
}
Sleep(500);
if(!pSocket->SendData(&msg1))break;
//offline broadcast
mysql.Format("select broadcast.SendTime,broadcast.SenderId,broadcast.msg,offbroadcast.num from broadcast,offbroadcast where offbroadcast.msgid=broadcast.msgid and offbroadcast.RecvId=%d",pData->MyId);
CRecordset rs(pDatabase);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CMsg1 msg3;
CDBVariant s1;
msg3.wIndex=pData->wIndex;
msg3.tarIP=pData->tarIP;
msg3.nPort=pData->nPort;
msg3.index=SYSTEM_BROADCAST;
msg3.FriendId=pData->MyId;
while(!rs.IsEOF())
{
rs.GetFieldValue(short(0),s1);
msg3.Time=s1.m_lVal;
rs.GetFieldValue(1,s1);
msg3.MyId=s1.m_lVal;
rs.GetFieldValue(2,msg3.Msg);
rs.GetFieldValue(3,s1);
int inum=0;
inum=s1.m_lVal;
Sleep(500);
if(pSocket->SendData(&msg3))
{
CString sql1;
sql1.Format("delete from offbroadcast where num=%d",inum);
pDatabase->ExecuteSQL(sql1);
}
else
{
rs.Close();
goto proc_end;
}
rs.MoveNext();
}
rs.Close();
//offline msg
mysql.Format("select * from offmsg where RecvId=%d",pData->MyId);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CMsg1 offmsg3;
CDBVariant dbMsgId,dbSenderId,dbRecvId,dbRecvTime,dbmIndex;
offmsg3.tarIP=pData->tarIP;
offmsg3.nPort=pData->nPort;
offmsg3.FriendId=pData->MyId;
offmsg3.wIndex=pData->wIndex;
while(!rs.IsEOF())
{
rs.GetFieldValue("MsgId",dbMsgId);
rs.GetFieldValue("SenderId",dbSenderId);
rs.GetFieldValue("RecvId",dbRecvId);
rs.GetFieldValue("RecvTime",dbRecvTime);
rs.GetFieldValue("mIndex",dbmIndex);
rs.GetFieldValue("Msg",offmsg3.Msg);
offmsg3.MyId=dbSenderId.m_lVal;
offmsg3.Time=dbRecvTime.m_lVal;
offmsg3.index=dbmIndex.m_chVal;
int inum=0;
inum=dbMsgId.m_lVal;
Sleep(500);
if(pSocket->SendData(&offmsg3))
{
CString sql1;
sql1.Format("delete from offmsg where MsgID=%d",inum);
pDatabase->ExecuteSQL(sql1);
}
else
{
rs.Close();
goto proc_end;
}
rs.MoveNext();
}
rs.Close();
::InterlockedIncrement((LPLONG)&pApp->m_nNumberOnline);
}
pUsers[pIndex].State=1;
pUsers[pIndex].IP=pData->tarIP;
pUsers[pIndex].Port=pData->nPort;
//找出把我当作好友的人,并发ONLINE消息
CRecordset recordset(pDatabase);
CString mysql;
mysql.Format("select MyId from Friends where FriendId=%d",pUsers[pIndex].Id);
recordset.Open(AFX_DB_USE_DEFAULT_TYPE,mysql);
CDBVariant value;
CNoticeMsg msg;
msg.index=SOMEONE_ONLINE;
msg.MyId=pData->MyId;
msg.IP=pData->tarIP;
msg.Port=pData->nPort;
while(!recordset.IsEOF())
{
recordset.GetFieldValue(short(0),value);
int pi=value.m_lVal-UserIdRadix;
if(pUsers[pi].State)
{
msg.tarIP=pUsers[pi].IP;
msg.nPort=pUsers[pi].Port;
pSocket->SendData(&msg);
}
recordset.MoveNext();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -