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

📄 svrsock.cpp

📁 类似于QQ的聊天工具,分为客户端和服务器端,有共享空间,能发布公告,可传输文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
BOOL CSvrSock::OnRecieve(SOCKET sSock)

{
	////////////////////////////////////////////////////////////////////
	//接收线程参数
	tagTmpInfo* pTmp                    = new tagTmpInfo;
	pTmp->m_pCn                         = &m_Cn;
	pTmp->m_hDlgWnd                     = &m_hDlgWnd;
	pTmp->m_hMutex                      = m_hMutex;
	pTmp->m_pTmpList                    = &m_pClntSockList;
	pTmp->m_CurUserInfo.m_sClientSocket = sSock;

	///////////////////////////////////////////////////////////////////
	//开启接收信息线程
	HANDLE Thread = CreateThread(NULL, 0, RecvProc, (LPVOID)pTmp, 0, 0);
	CloseHandle(Thread);
	return TRUE;
}


/*---------------------------------------------------------------------------
 公告数据发送处理函数:
 ---------------------------------------------------------------------------*/
BOOL CSvrSock::OnSendCall(CString strDptm, CString strCall)
{
	CMsgBag bagTool;
	tagPacketParam pp;
	
	
	pp.order    = "9007";
	pp.UserChar = strCall;
	pp.paramNum = 1;

	CString strBuf;
	bagTool.DataPackage(strBuf, &pp);

	CRecs rs;
	CString strSql;

	if(m_pClntSockList.GetCount() < 2)
		return FALSE;

	WaitForSingleObject(m_hMutex, INFINITE);	/*dong 12-17*/
	tagClientSockeInfo* pDel;
	POSITION  pos = m_pClntSockList.GetHeadPosition();

	int a = 0;
	for(int i = 0; i < (m_pClntSockList.GetCount()-1); i++)
	{
		pDel = m_pClntSockList.GetNext(pos);

		if(strDptm != "所有")
		{
			strSql = "select UserDptm from UserInfo where  UserId = '"+ pDel->m_strUsrId +"'";
			if(!rs.Open(m_Cn.GetActiveConn (), (_variant_t)strSql))
				return FALSE;

			_variant_t value = rs.GetRs()->GetCollect((_variant_t)0L);
			if(strDptm == (char*)(_bstr_t)value)
			{
				a++;
				bagTool.SetSourUserId(pDel->m_strUsrId, strBuf);	/*dong 12-17*/
				bagTool.ModifyPacketLen(strBuf);					/*dong 12-17*/

				Sleep(10);
				send(pDel->m_sClientSocket, 
					strBuf.GetBuffer(0), strBuf.GetLength() + 1, 0);
			}

		}
		else
		{
			bagTool.SetSourUserId(pDel->m_strUsrId, strBuf);	/*dong 12-17*/
			bagTool.ModifyPacketLen(strBuf);					/*dong 12-17*/

			Sleep(10);
			send(pDel->m_sClientSocket, 
				strBuf.GetBuffer(0), strBuf.GetLength() + 1, 0);
		}
		rs.CloseRs();

	}
	ReleaseMutex(m_hMutex);		/*dong 12-17*/

	/*if(i == 0)
		return FALSE;*/		   /*dong 12-17*/

	if(a == 0 && strDptm != "所有")
		return FALSE;

	return TRUE;
}


/*---------------------------------------------------------------------------
 客户端断开连接处理函数:
 ---------------------------------------------------------------------------*/
BOOL CSvrSock::OnClose(SOCKET sSock)
{

	closesocket(sSock);
	CString strLeaveUeserId = "";

	/////////////////////////////////////////////////////////////////////////
	//查找断开连接的用户
	tagClientSockeInfo* pTmp;
	POSITION pos1, pos2;

	WaitForSingleObject(m_hMutex, INFINITE);

	pos1 = m_pClntSockList.GetHeadPosition();
	for(; ( pos2 = pos1 ) != NULL;)
	{
     	pTmp = m_pClntSockList.GetNext(pos1);
		if(pTmp->m_sClientSocket == sSock)
		{
			/////////////////////////////////////////////////////////////////
			//已经登陆的用户
			if(pTmp->m_bOnLine)
			{
				//保存离线用户ID,用于通知其他用户
				strLeaveUeserId = pTmp->m_strUsrId;

				//服务器保留离线用户信息
				tagServerSysMsg* msg = new tagServerSysMsg;
				msg->strSydMsg[0].Format("%d", pTmp->m_sClientSocket);
				msg->strSydMsg[1] = pTmp->m_strUsrName;
				msg->strSydMsg[2] = pTmp->m_strUsrId;
				msg->strSydMsg[3] = pTmp->m_strFilePort;
				msg->strSydMsg[4] = pTmp->m_strIp;
				msg->strSydMsg[5] = "用户离线";
				PostMessage(m_hDlgWnd, WM_DEALSYSMSG, (WPARAM)msg, 0); 
			}

			pTmp = m_pClntSockList.GetAt(pos2);
			//csi  = *pTmp;
			m_pClntSockList.RemoveAt(pos2);
			delete pTmp;
			break;
		}
	}
	ReleaseMutex(m_hMutex);
	//向在线用户发送下线的用户ID
	if(!strLeaveUeserId.IsEmpty())
	{
		SendLeaveUser(strLeaveUeserId);
	}
	return TRUE;
}


/*---------------------------------------------------------------------------
 返回服务器监听套接字
 ---------------------------------------------------------------------------*/
SOCKET& CSvrSock::GetServerSocket()
{
	return m_sServerSocket;
}


/*---------------------------------------------------------------------------
 返回服务器监听状态
 ---------------------------------------------------------------------------*/
SOCKET& CSvrSock::GetCurClientSocket()
{
	return m_sCurClientSocket;
}


/*---------------------------------------------------------------------------
 返回服务器监听状态
 ---------------------------------------------------------------------------*/
BOOL CSvrSock::GetServerStatus()
{
	return m_bLintenStatus;
}


/*---------------------------------------------------------------------------
 暂停服务器(不涉及文件服务)
 ---------------------------------------------------------------------------*/
void CSvrSock::CloseServer()
{
	closesocket(m_sServerSocket);
	CSock::~CSock();

	m_bLintenStatus = false;

	//链表中获取服务器信息
	tagClientSockeInfo* pTmp = m_pClntSockList.GetTail();
	//服务器保留暂停服务信息
	tagServerSysMsg* msg = new tagServerSysMsg;
	msg->strSydMsg[0].Format("%d", pTmp->m_sClientSocket);
	msg->strSydMsg[1] = pTmp->m_strUsrName;
	msg->strSydMsg[2] = pTmp->m_strUsrId;
	msg->strSydMsg[3] = pTmp->m_strFilePort;
	msg->strSydMsg[4] = pTmp->m_strIp;
	msg->strSydMsg[5] = "服务器暂停";
	PostMessage(m_hDlgWnd, WM_DEALSYSMSG, (WPARAM)msg, 0); 

	//清空m_pClntSockList链表
	WaitForSingleObject(m_hMutex, INFINITE);

	POSITION pos = m_pClntSockList.GetHeadPosition(); 
	for(int i = 0; i < m_pClntSockList.GetCount(); i++)
	{
		pTmp = m_pClntSockList.GetNext(pos);

		delete pTmp;
	}
	m_pClntSockList.RemoveAll();
	ReleaseMutex(m_hMutex);
}


/*---------------------------------------------------------------------------
 打开数据库连接
 ---------------------------------------------------------------------------*/
BOOL CSvrSock::ConnectDB()
{
	/////////////////////////////////////////////////////////////////////////
	//数据库连接
	CString strCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;Persist Security Info=False";

	if(!m_Cn.Open((_bstr_t)strCn))
	{
		return false;
	}

	return true;
}


/*---------------------------------------------------------------------------
 获取数据库连接类对象
 ---------------------------------------------------------------------------*/
CConn& CSvrSock::GetCn()
{
	return m_Cn;
}


/*---------------------------------------------------------------------------
 关闭数据库连接
 ---------------------------------------------------------------------------*/
void CSvrSock::UnConnectDB()
{
	m_Cn.Close();
}



/*---------------------------------------------------------------------------
 向在线用户发送离线用户信息
 ---------------------------------------------------------------------------*/
void CSvrSock::SendLeaveUser(CString strLeaveId)
{
	CMsgBag bagTool;
	tagPacketParam pp;

	tagClientSockeInfo* pDel;

	WaitForSingleObject(m_hMutex, INFINITE);
	POSITION  pos = m_pClntSockList.GetHeadPosition();
	for(int i = 0; i < m_pClntSockList.GetCount(); i++)
	{
		pDel = m_pClntSockList.GetNext(pos);
		
		pp.order    = "9010";
		pp.UserId   = strLeaveId; //用户帐号
		pp.paramNum = 1;

		CString strBuf;
		bagTool.DataPackage(strBuf, &pp);
		
		Sleep(10);
		send(pDel->m_sClientSocket, 
			strBuf.GetBuffer(0), strBuf.GetLength() + 1, 0);

	}
	ReleaseMutex(m_hMutex);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -