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

📄 socketcontrol.cpp

📁 Cisco CVP 的Call Serve与第3方CTI的通信协议
💻 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 + -