📄 socketcontrol.cpp
字号:
// SocketControl.cpp: implementation of the CSocketControl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SocketControl.h"
#include "yes.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSocketControl::CSocketControl(HandleSocketData m_func)
{
m_listevent=CreateEvent(NULL,FALSE,FALSE,NULL);
m_handledatafuction=m_func;
for(int i=0;i<MAX_RECV_THREAD;i++)
{
m_endevents[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
m_recvevents[i]=CreateEvent(NULL,TRUE,TRUE,NULL);
m_recvthreads[i]=new CSocketReceiveThread(this);
m_recvthreads[i]->m_event=m_endevents[i];
m_recvthreads[i]->CreateThread();
}
}
CSocketControl::~CSocketControl()
{
CloseHandle(m_listevent);
for(int i=0;i<MAX_RECV_THREAD;i++)
{
CloseHandle(m_recvevents[i]);
CloseHandle(m_endevents[i]);
}
}
DWORD CSocketControl::ListenSocketThread(LPVOID lp)
{
CSocketControl* p=(CSocketControl*)lp;
while(p->m_run)
{
p->m_socklock.Lock();
int cnt=p->m_socklist.GetCount();
for(int i=0;i<cnt;i++)
{
DWORD tindex=WaitForMultipleObjects(MAX_RECV_THREAD,p->m_recvevents,FALSE, INFINITE);
tindex=tindex-WAIT_OBJECT_0;
if(p->m_socklist.IsEmpty()) break;
SOCKET obj=(SOCKET)(p->m_socklist.RemoveHead());
FD_SET fd = {1, obj};
TIMEVAL tv = {0, 0};
int ret=select(0, &fd, NULL, NULL, &tv);
if(ret==1)
{
CONN* conn=p->getconnbysocket(obj);
if(conn&&conn->m_actiontag==0)
{
conn->m_actiontag=1;
ResetEvent(p->m_recvevents[tindex]);
p->m_recvthreads[tindex]->PostThreadMessage(WM_RECV_SOCKET,(WPARAM)tindex,(LPARAM)conn);
}
//p->m_socklist.AddTail((void*)obj);
}else if(ret==0)
{
p->m_socklist.AddTail((void*)obj);
}
else if(ret==SOCKET_ERROR)
{
p->removeconn(obj);
}
}
p->m_socklock.Unlock();
Sleep(1);
}
SetEvent(p->m_listevent);
return 0;
}
bool CSocketControl::insertconn(SOCKET sock)
{
m_connlock.Lock();
CONN * m_conn=new CONN;
m_conn->m_actiontag=0;
time_t(&(m_conn->m_conntime));
m_conn->m_socket=sock;
m_sock2conn.SetAt((void*)sock,m_conn);
m_connlock.Unlock();
m_socklock.Lock();
m_socklist.AddTail((void*)sock);
m_socklock.Unlock();
return true;
}
CONN* CSocketControl::getconnbysocket(SOCKET _sock,bool lock)
{
CONN* conn=NULL;
if(lock)
m_connlock.Lock();
BOOL IsFound=m_sock2conn.Lookup((void*)_sock,((void*&)conn));
if(lock)
m_connlock.Unlock();
if(IsFound)
return conn;
return NULL;
}
void CSocketControl::removeallconn()
{
CONN* conn=NULL;
m_connlock.Lock();
while(!m_sock2conn.IsEmpty())
{
POSITION pos=m_sock2conn.GetStartPosition();
SOCKET sock;
m_sock2conn.GetNextAssoc(pos,(void*&)sock,(void*&)conn);
m_sock2conn.RemoveKey((void*)sock);
CloseSocket(sock);
delete conn;
}
m_connlock.Unlock();
}
void CSocketControl::removeconn(SOCKET _sock,bool _close)
{
CONN* conn=NULL;
m_connlock.Lock();
BOOL IsFound=m_sock2conn.Lookup((void*)_sock,((void*&)conn));
if(IsFound)
{
m_sock2conn.RemoveKey((void*)_sock);
if(_close)
CloseSocket(_sock);
delete conn;
}
m_connlock.Unlock();
}
void CSocketControl::RunListen()
{
m_run=true;
ResetEvent(m_listevent);
DWORD tid;
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ListenSocketThread,this,0,&tid);
}
void CSocketControl::StopListen()
{
m_run=false;
WaitForSingleObject(m_listevent,INFINITE);
removeallconn();
for(int i=0;i<MAX_RECV_THREAD;i++)
{
m_recvthreads[i]->PostThreadMessage(WM_QUIT,0,0);
}
WaitForMultipleObjects(MAX_RECV_THREAD,m_endevents,TRUE, INFINITE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -