fix tcp bug.

This commit is contained in:
floyd 2015-07-03 19:00:11 +08:00
parent 6dea6bfba3
commit 7b9c1a0b15
3 changed files with 63 additions and 9 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
};