fix tcp bug.
This commit is contained in:
parent
6dea6bfba3
commit
7b9c1a0b15
|
@ -142,9 +142,14 @@ int CommManager::AddCommService(int port,int name)
|
|||
{
|
||||
CTcp *tcp = new CTcp;
|
||||
tcp->Init();
|
||||
tcp->Start(port,TcpMsgHandler);
|
||||
if (!tcp->Start(port,TcpMsgHandler))
|
||||
{
|
||||
delete tcp;
|
||||
break;
|
||||
}
|
||||
|
||||
info.nCommName = COMMNAME_TCP;
|
||||
info.lpParameter1 = tcp;
|
||||
|
||||
m_commMap.insert(MAKE_PAIR(COMM_MAP,serial,info));
|
||||
|
||||
|
@ -173,17 +178,25 @@ BOOL CommManager::DeleteCommService(int serialid)
|
|||
{
|
||||
TerminateThread(info.lpParameter2,0);
|
||||
mg_destroy_server((mg_server**)&info.lpParameter1);
|
||||
|
||||
m_commMap.erase(it);
|
||||
|
||||
break;
|
||||
}
|
||||
case COMMNAME_TCP:
|
||||
{
|
||||
CTcp *tcp = (CTcp *)info.lpParameter1;
|
||||
tcp->Stop();
|
||||
delete tcp;
|
||||
|
||||
m_commMap.erase(it);
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
bRet = FALSE;
|
||||
break;
|
||||
}
|
||||
delete it->second.lpParameter1;
|
||||
return TRUE;
|
||||
}
|
||||
else bRet = FALSE;
|
||||
|
|
|
@ -18,6 +18,23 @@ void CTcp::Init()
|
|||
WSAStartup(MAKEWORD(2,2),&data);
|
||||
}
|
||||
|
||||
void CTcp::Stop()
|
||||
{
|
||||
m_sock.Close();
|
||||
|
||||
m_cs.Enter();
|
||||
|
||||
VecSocket::iterator it = m_vecSock.begin();
|
||||
|
||||
for (; it != m_vecSock.end(); it++)
|
||||
{
|
||||
::closesocket(*it);
|
||||
}
|
||||
|
||||
m_cs.Leave();
|
||||
|
||||
}
|
||||
|
||||
bool CTcp::Start(int port , tcpHandler handler)
|
||||
{
|
||||
bool ret = FALSE;
|
||||
|
@ -28,6 +45,8 @@ bool CTcp::Start(int port , tcpHandler handler)
|
|||
|
||||
if (socket.Bind(port))
|
||||
{
|
||||
m_sock = socket;
|
||||
|
||||
ARGV_LIST* argv = new ARGV_LIST;
|
||||
|
||||
argv->handler = handler;
|
||||
|
@ -35,7 +54,7 @@ bool CTcp::Start(int port , tcpHandler handler)
|
|||
argv->lpParameter = this;
|
||||
|
||||
listen(socket,25);
|
||||
_beginthread(ListenProc,0,argv);
|
||||
_beginthread(Listen,0,argv);
|
||||
|
||||
ret = TRUE;
|
||||
}
|
||||
|
@ -87,13 +106,13 @@ void CTcp::Worker(LPVOID lpParameter)
|
|||
}
|
||||
}
|
||||
|
||||
socket.Close();
|
||||
|
||||
delete lpParameter;
|
||||
}
|
||||
|
||||
void CTcp::ListenProc(LPVOID lpParameter)
|
||||
void CTcp::ListenProc( ARGV_LIST *argv )
|
||||
{
|
||||
ARGV_LIST *argv = (ARGV_LIST*)lpParameter;
|
||||
|
||||
MySocket socket(argv->s,TRUE);
|
||||
|
||||
SOCKADDR_IN sin;
|
||||
|
@ -102,6 +121,10 @@ void CTcp::ListenProc(LPVOID lpParameter)
|
|||
|
||||
while(socket.Accept(sin,acc))
|
||||
{
|
||||
m_cs.Enter();
|
||||
m_vecSock.push_back(acc);
|
||||
m_cs.Leave();
|
||||
|
||||
ARGV_LIST * client_argv = new ARGV_LIST;
|
||||
|
||||
client_argv->handler = argv->handler;
|
||||
|
@ -112,5 +135,14 @@ void CTcp::ListenProc(LPVOID lpParameter)
|
|||
_beginthread(Worker,0,client_argv);
|
||||
}
|
||||
|
||||
delete lpParameter;
|
||||
socket.Close();
|
||||
delete argv;
|
||||
}
|
||||
|
||||
void CTcp::Listen(LPVOID lpParameter)
|
||||
{
|
||||
ARGV_LIST *argv = (ARGV_LIST*)lpParameter;
|
||||
CTcp* tcp = (CTcp*)argv->lpParameter;
|
||||
|
||||
return tcp->ListenProc((ARGV_LIST*)lpParameter);
|
||||
}
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
typedef BOOL (*tcpHandler)(LPBYTE data,DWORD size,SOCKADDR_IN sin,ByteBuffer& toSender);
|
||||
|
||||
typedef std::vector<SOCKET> VecSocket;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SOCKET s;
|
||||
|
@ -23,13 +25,20 @@ public:
|
|||
|
||||
void Init();
|
||||
bool Start(int port , tcpHandler handler);
|
||||
bool Stop();
|
||||
void Stop();
|
||||
|
||||
private:
|
||||
|
||||
static void ListenProc(LPVOID lpParameter);
|
||||
CriticalSection m_cs;
|
||||
VecSocket m_vecSock;
|
||||
|
||||
|
||||
static void Listen(LPVOID lpParameter);
|
||||
void ListenProc(ARGV_LIST *argv);
|
||||
|
||||
static void Worker(LPVOID lpParameter);
|
||||
|
||||
|
||||
MySocket m_sock;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue