⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recvdata.cpp

📁 仿QQ的聊天程序vc++/mfc来学习的简易聊天室代码功能较全
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	//		处理客户请求的线程函数						         //	

#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 + -