Socket通信,服务端在客户端始终有连接时不会发生时候错误,但是当客户端长时间没有连接服务器端时(24小时左右),发现服务端不能连接上了,telnet服务端的监听端口也不能连接。该程序是一个Windows服务程序,其中监听部分启的是一个监听线程,在telnet服务端端口不同时,主线程运行正常,请问各位大侠如何解决?监听部分代码如下:
DWORD WINAPI CertSignListenTask(LPVOID lpParameter)
{
WriteLogInfo(0, "", "CertSign监听线程开始运行");
//#ifdef PLAIN_COMM_
WSADATA wsadata;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
return -1; // wsa init fail

SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockServer){
WriteLogInfo(1, "", "创建主SOCKET失败");
WSACleanup();
return -1; // socket fail
}
BOOL bReuse = TRUE;
int nrv= setsockopt(sockServer,SOL_SOCKET,SO_REUSEADDR,(const char *)&bReuse,sizeof(bReuse));
if (nrv != 0 ) {
WriteLogInfo(1, "", "设置参数失败");
shutdown(sockServer,SD_BOTH);
closesocket(sockServer);
WSACleanup();
return -1; // socket fail
}
CA_PARAM param;
SOCKADDR_IN addrServer; // 服务器地址
addrServer.sin_family = AF_INET; // TCP/IP协议
#ifdef _DEBUG
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
#else
if (ReadParam(CERTSIGN_SERVICE_PROCESS, CERTSIGN_LOACL_IP, param) != 0)
{
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
}
else
{
//addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrServer.sin_addr.S_un.S_addr = inet_addr(param.PARAMVALUE);
}
#endif
//addrServer.sin_port = htons(CERTSIGN_CERT_PORT); // htons
addrServer.sin_port = htons(serverPort.CertSignPort);

if (0 != bind(sockServer, (SOCKADDR *)&addrServer, sizeof(addrServer))){
WriteLogInfo(1, "", "绑定主SOCKET失败");
closesocket(sockServer);
WSACleanup();
return -1; // bind fail
}
if (0 != listen(sockServer, SOMAXCONN)){
WriteLogInfo(1, "", "LISTEN主SOCKET失败");
closesocket(sockServer);
WSACleanup();
return -1; // listen fail
}
while (bServiceRunning)
{
SOCKADDR_IN addrClient;
SOCKET sockClient;
int iAddrLen = sizeof(addrClient);
// 开始接受tcp连接请求
sockClient = accept(sockServer, (SOCKADDR *)&addrClient, &iAddrLen);
if (INVALID_SOCKET == sockClient)
{
break; // fail, 跳出while循环
}
WriteLogInfo(0, "", "接收到TCP请求");
//进行线程池的处理
QueueUserWorkItem(CertSignTcpTask, (PVOID)sockClient, WT_EXECUTEDEFAULT);
//---------------
//Sleep(CERT_SIGN_SLEEP_TIMEOUT);
}
shutdown(sockServer,SD_BOTH);
closesocket(sockServer);
WSACleanup();
WriteLogInfo(0, "", "监听线程正常结束");
return 0;
}