//accept线程,accept的run函数 //return value:0 线程正常 // 1 线程退出时关闭socket失败 // 2 accept出错 int CSWL_ListenProcEx::AcceptThreadRun() { SWL_socket_t sClientLinkSock; struct sockaddr struAddr; SWL_socklen_t len = sizeof(struAddr); while(m_bAcceptThreadRun) { sClientLinkSock = SWL_Accept(m_SocketListen, (struct sockaddr *)&struAddr, &len); if(SWL_INVALID_SOCKET == sClientLinkSock) { if(SWL_EWOULDBLOCK()) { #ifdef __CHIP3515__ PUB_Sleep(100); #else PUB_Sleep(100); #endif continue; } else { SWL_PrintError(__FILE__, __LINE__); assert(false);//xg 如果出错,不好处理,退出该线程后,新的客户端就进不来了 return 2; } } m_clientSockInfo.pTcpSock = sClientLinkSock; struct sockaddr_in * sockAddr = (struct sockaddr_in*)&struAddr; m_clientSockInfo.dwIP = sockAddr->sin_addr.s_addr; m_clientSockInfo.nPort = sockAddr->sin_port; //调用对象构造时注册的回调函数 if (0 != m_pAcceptCallback(&m_clientSockInfo, m_pParam, NULL)) { SWL_CloseSocket(m_clientSockInfo.pTcpSock); } } if ( 0 != SWL_CloseSocket(m_SocketListen) ) { return 1; } return 0; }
bool CHSSocket::AcceptConnection() { int iNewSocket; struct sockaddr_in sAddr; #ifdef WIN32 iSize = sizeof(sAddr); iNewSocket =::accept(m_iSocket, (struct sockaddr *) &sAddr, &iSize); #else socklen_t len = sizeof(sAddr); iNewSocket = accept(m_iSocket, (struct sockaddr *) &sAddr, &len); #endif if (iNewSocket > 0) { // Create a new connection for this socket. CHSSocket *pSocket = new CHSSocket; pSocket->m_iSocket = iNewSocket; // Initialize callbacks to our callbacks. pSocket->SetCallbacks(m_pReceiveCallback, m_pAcceptCallback, m_pCloseCallback); pSocket->m_sinRemoteAddr = *((struct sockaddr_in *) &sAddr); if (m_pAcceptCallback) { m_pAcceptCallback(pSocket); } else { delete pSocket; } return true; } return false; }
int CSWL_ListenProcEx::AcceptThread6Run() { SWL_socket_t sClientLinkSock; struct sockaddr_in6 structAddrIn6; SWL_socklen_t len = sizeof(structAddrIn6); memset(&m_clientSockInfo, 0, sizeof(CLIENT_SOCK_INFO)); while(m_bAcceptThreadRun) { sClientLinkSock = SWL_Accept(m_SocketListen, (struct sockaddr *)&structAddrIn6, &len); if(SWL_INVALID_SOCKET == sClientLinkSock) { if(SWL_EWOULDBLOCK()) { #ifdef __CHIP3515__ PUB_Sleep(100); #else PUB_Sleep(100); #endif continue; } else { SWL_PrintError(__FILE__, __LINE__); assert(false);//xg 如果出错,不好处理,退出该线程后,新的客户端就进不来了 return 2; } } m_clientSockInfo.pTcpSock = sClientLinkSock; //m_clientSockInfo.dwIP = structAddrIn6.sin6_addr; m_clientSockInfo.nPort = structAddrIn6.sin6_port; //如果是IPV4的IP地址,记录IP信息。对于IPV6的地址设置为255.255.255.255 unsigned char * pIpAddr = structAddrIn6.sin6_addr.s6_addr; if (0x00 == pIpAddr[0] && 0x00 == pIpAddr[1] && 0x00 == pIpAddr[2] && 0x00 == pIpAddr[3] && 0x00 == pIpAddr[4] && 0x00 == pIpAddr[5] && 0x00 == pIpAddr[6] && 0x00 == pIpAddr[7] && 0x00 == pIpAddr[8] && 0x00 == pIpAddr[9] && 0xFF == pIpAddr[10] && 0xFF == pIpAddr[11]) { //表示这是个IPV4的客户端 char * pIp = (char *)&m_clientSockInfo.dwIP; pIp[0] = pIpAddr[12]; pIp[1] = pIpAddr[13]; pIp[2] = pIpAddr[14]; pIp[3] = pIpAddr[15]; struct in_addr in; memset(&in, 0, sizeof(struct in_addr)); in.s_addr = m_clientSockInfo.dwIP; } else { memset(&m_clientSockInfo.dwIP, 0xff, sizeof(m_clientSockInfo.dwIP)); } printf("%s:%s:%d, get accept for ipv6 client\n", __FUNCTION__, __FILE__, __LINE__); //调用对象构造时注册的回调函数 if (!m_pAcceptCallback(&m_clientSockInfo, m_pParam, NULL)) { SWL_CloseSocket(m_clientSockInfo.pTcpSock); } } if ( 0 != SWL_CloseSocket(m_SocketListen) ) { return 1; } return 0; }