16,473
社区成员
发帖
与我相关
我的任务
分享
int SyncTcpServer::start()
{
if (stopRunning) return 0;
listenThread = ::CreateThread(NULL,
0, listenClient, this, 0, NULL);
return 0;
}
/× 此函数为线程处理函数 ×/
DWORD WINAPI SyncTcpServer::listenClient(LPVOID arg)
{
SyncTcpServer *pThis = (SyncTcpServer *)arg;
sockaddr_in addr;
int addrLen = sizeof(sockaddr_in);
SOCKET s;
while (!pThis->stopRunning) {
s = accept(pThis->sock, (sockaddr *)&addr, &addrLen);
if (s == INVALID_SOCKET) {
pThis->onServerClosed();
break;
}
pThis->newClientAccepted(s, addr);
}
return 0;
}
void SyncTcpServer::newClientAccepted(SOCKET s, sockaddr_in addr)
{
if (s == INVALID_SOCKET) {
/* something didn't expected happened */
return ;
}
addSock(s, inet_ntoa(addr.sin_addr));
onNewClientAccepted(inet_ntoa(addr.sin_addr));
HANDLE thrd = ::CreateThread(NULL, 0, handleClient, this, 0, NULL);
handleThreads.push_back(thrd);
}
void SyncTcpServer::addSock(SOCKET s, std::string ipAddr)
{
::WaitForSingleObject(mutex, INFINITE);
ClientDesc *newClient = new ClientDesc(s, ipAddr);
clients.push_back(newClient); // 出错地
::ReleaseMutex(mutex);
}
iterator insert(const_iterator _Where, const _Ty& _Val)
{ // insert _Val at _Where
size_type _Off = size() == 0 ? 0 : _Where - begin();
_Insert_n(_Where, (size_type)1, _Val);
return (begin() + _Off);//每次报错均在此处
}