- 论坛徽章:
- 0
|
服务器端的侦听线程
DWORD WINAPI Fsocket::ListenThreadFunc(LPVOID Para)
{
SOCKET hSocket,hClientSocket;
struct sockaddr_in server,addr;
int addrlen = sizeof(addr);
char szIP[15+1];
int nErr;
CString str;
//设置侦听线程运行标志
m_bListenRun = true;
//创建 Listen SOCKET
if((hSocket = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"创建侦听通讯端口错误");
//设置侦听线程运行标志
m_bListenRun = false;
return -1;
}
//fill in server structure
ZeroMemory((char*)&server,sizeof(server));
server.sin_family = AF_INET;
if (strlen(theApp.m_sServer) > 0 && strcmp(theApp.m_sServer,"127.0.0.1") != 0)
{
unsigned long ip_addr = inet_addr(theApp.m_sServer);
CopyMemory((char *)&(server.sin_addr),(char *)&ip_addr,sizeof(server.sin_addr));
}
else server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(theApp.m_nPort);
//bind address to socket
if(bind(hSocket,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
{
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"绑定侦听IP和通讯端口错误");
closesocket(hSocket);
//设置侦听线程运行标志
m_bListenRun = false;
str.Format("绑定侦听IP[%s]和通讯端口[%d]错误\n\n可能的原因:\n1、IP地址不存在\n2、端口被占用\n3、其它用户已启动本程序",theApp.m_sServer,theApp.m_nPort);
AfxMessageBox(str);
// AfxMessageBox("绑定侦听IP和通讯端口错误\n\n该IP不存在或该端口可能被占用!");
return -1;
}
//侦听通讯端口
if (listen(hSocket,50) == SOCKET_ERROR)
{
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"准备侦听通讯端口错误");
closesocket(hSocket);
//设置侦听线程运行标志
m_bListenRun = false;
return -2;
}
int nError;
fd_set fds;
//设置检测状态,等待时间为1秒
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec= 10;
while(WaitForSingleObject(m_hListenExitEvent,5) != WAIT_OBJECT_0)
{
//检测侦听SOCKET的状态
FD_ZERO(&fds);
FD_SET(hSocket,&fds);
nError=select((int)hSocket+1,&fds,NULL,NULL,&timeout);
//发生错误
if (nError == SOCKET_ERROR)
{
int nErr;
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"侦听通讯端口错误");
break;
}
//无数据
if (nError == 0) continue;
//接受连接
hClientSocket = accept(hSocket,(struct sockaddr *)&addr,&addrlen);
if (hClientSocket == INVALID_SOCKET) continue;
strcpy_s(szIP,inet_ntoa(addr.sin_addr));
if (strcmp(theApp.m_szUsePool,"Y") != 0)
{
//创建通讯线程
if (!CreateClientThread(hClientSocket,szIP))
{
//创建失败
closesocket(hClientSocket);
}
}
else
{
int nTask;
//获取连接池资源
nTask = CTaskPool::GetClientTask(TIME_WAITSLOTRC);
if (nTask < 0)
{
//创建失败
closesocket(hClientSocket);
//
str.Format("侦听获得连接池错误,IP:%s",szIP);
WriteTraceLog(TRACE_COMERR,0,(char *)((LPCTSTR)str));
}
else
{
//向任务池中写入任务
CTaskPool::WriteClientTask(nTask,hClientSocket,szIP);
}
}
}
closesocket(hSocket);
//设置侦听线程运行标志
m_bListenRun = false;
return 0;
} |
|