Exemplo n.º 1
0
//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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
0
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;
}