📄 svrsock.cpp
字号:
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 + -