예제 #1
0
파일: SSLClient.cpp 프로젝트: dulton/proxy
int CSSLClient::SSLRead(void *pBuf, int bufLen)
{
	if (NULL == pBuf || bufLen == 0 || NULL == m_pSSL)//
	{
		return 0;
	}

	unsigned long reTry = 0; 
	int ret = 0, err = 0;
	int tmpRecvLen = 0;
	while((reTry++ < SSL_SOCKET_CONNECT_RETRIES) && tmpRecvLen <= bufLen)
	{
		if((ret = SSL_read(m_pSSL, (void *)((char *)pBuf + tmpRecvLen), bufLen - tmpRecvLen)) <= 0)
		{
			err = SSL_get_error(m_pSSL, ret);
			if(SSL_ERROR_WANT_READ == err)
			{
				PUB_Sleep(1); // wait a while
			}
			else
			{
				printf("SSL_read Err, Cur read Len:%d  Need Len : %d\n", tmpRecvLen, bufLen);
				FreeRsource();
				return -1;
			}
		}
		else
		{
			tmpRecvLen += ret;
			break;
		}
	}

	return tmpRecvLen;
}
예제 #2
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;
}
예제 #3
0
void CDeviceConnector::WaitForConnect(int timeouts)
{
	int count = 0;
	while(!m_bConnected && count < timeouts)
	{
		PUB_Sleep(10);
		count += 10;
	}
}
예제 #4
0
SWL_socket_t CSWL_ListenProcEx::CreateIPV4Socket(unsigned short port)
{
	SWL_socket_t sockfd = SWL_INVALID_SOCKET;
	//创建一个socket,创建的所有的socket都是非阻塞的
	sockfd = SWL_CreateSocket(AF_INET, SOCK_STREAM, 0);
	if(SWL_INVALID_SOCKET == sockfd)
	{
		printf("%s:%s:%d, Create socket error\n", __FUNCTION__, __FILE__, __LINE__);
		assert(false);
		return sockfd;
	}

	struct sockaddr_in sockaddrIn4;
	memset(&sockaddrIn4, 0, sizeof(struct sockaddr_in));

	SWL_socklen_t  sockAddrLen = sizeof(struct sockaddr_in);

	sockaddrIn4.sin_family = AF_INET;
	sockaddrIn4.sin_addr.s_addr = htonl(INADDR_ANY);;
	sockaddrIn4.sin_port = htons(port); 		//这里要转成网络序
	memset(&(sockaddrIn4.sin_zero), '\0', 8);	// zero the rest of the struct

	int reuse = 1;
	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int));

	int iSendBuffer = 256 * 1024;
	setsockopt(m_SocketListen, SOL_SOCKET, SO_SNDBUF, (char *)&iSendBuffer, sizeof(int));

	int iSendLowat = 128 * 1024;
	setsockopt(m_SocketListen, SOL_SOCKET, SO_SNDLOWAT, (char *)&iSendLowat, sizeof(int));


	//绑定socket
	int	iLoop = 0;
	while(0 != SWL_Bind(sockfd, (sockaddr*)&sockaddrIn4, sizeof(sockaddr_in)))
	{
		++iLoop;
		if (iLoop < 60) 
		{
			SWL_PrintError(__FILE__,__LINE__);				
			PUB_Sleep(2000);
		}
		else
		{
			SWL_PrintError(__FILE__,__LINE__);
			SWL_CloseSocket(sockfd);
			sockfd = SWL_INVALID_SOCKET;
			break;
		}			
	}

	return sockfd;
}
예제 #5
0
파일: SSLClient.cpp 프로젝트: dulton/proxy
int	CSSLClient::SSLWrite(const void * pDataBuf, int dataLen)
{
	if (pDataBuf == NULL)
	{
		printf("SSLWrite pDataBuf NULL\n");
		return -1;
	}
	if (dataLen == 0)
	{
		printf("SSLWrite dataLen 0\n");
		return 0;
	}
	if (m_pSSL == NULL)
	{
		printf("SSLWrite m_pssl NULL\n");
		return -1;
	}
	if (m_pSSL->method == NULL || m_pSSL->packet == NULL || m_pSSL->wbio == NULL)
	{
		printf("m_pssl contains NULL\n");
		return -1;
	}

	unsigned long reTry = 0; 
	int ret = 0, err = 0;
	int tmpSendLen = 0;;
	while((reTry++ < SSL_SOCKET_CONNECT_RETRIES) && tmpSendLen != dataLen)
	{
		if((ret = SSL_write(m_pSSL, (const void *)((char *)pDataBuf + tmpSendLen), dataLen - tmpSendLen)) <= 0)
		{
			err = SSL_get_error(m_pSSL, ret);
			if(SSL_ERROR_WANT_WRITE == err)
			{
				PUB_Sleep(1); // wait a while
			}
			else
			{
				printf("SSL_write Err, Cur Send Len:%d  Need Len : %d\n", tmpSendLen, dataLen);
				FreeRsource();
				return -1;
			}
		}
		else
		{
			tmpSendLen += ret;
		}
	}

	return tmpSendLen;
}
예제 #6
0
SWL_socket_t CSWL_ListenProcEx::CreateIPV6Socket(unsigned short port)
{
	SWL_socket_t  sockfd = SWL_INVALID_SOCKET;
	sockfd = SWL_CreateSocket(PF_INET6, SOCK_STREAM, 0);
	if (SWL_INVALID_SOCKET == sockfd)
	{
		printf("%s:%s:%d, Create socket error\n", __FUNCTION__, __FILE__, __LINE__);
		assert(false);
		return SWL_INVALID_SOCKET;
	}

	struct sockaddr_in6 sockaddrIn6;
	memset(&sockaddrIn6, 0, sizeof(struct sockaddr_in6));
	sockaddrIn6.sin6_family = PF_INET6;
	sockaddrIn6.sin6_port   = htons(port);
	//sockaddrIn6.sin6_addr	= in6addr_any;

	int reuse = 1;
	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int));

	//reuse = 1;
	//setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, &reuse, sizeof(int));
	//setsockopt(sockfd, IPPROTO_IPV6, 26, &reuse, sizeof(int));

	int	iLoop = 0;
	while(0 != SWL_Bind(sockfd, (sockaddr*)&sockaddrIn6, sizeof(struct sockaddr_in6)))
	{
		++iLoop;
		if (iLoop < 60) 
		{
			SWL_PrintError(__FILE__,__LINE__);				
			PUB_Sleep(2000);
		}
		else
		{
			SWL_PrintError(__FILE__,__LINE__);
			SWL_CloseSocket(sockfd);
			sockfd = SWL_INVALID_SOCKET;
			break;
		}			
	}

	return sockfd;
}
예제 #7
0
파일: TCPServer.cpp 프로젝트: wukehu/rtsp
int TCPServer::run()
{
	int nInterval = 0;
	while (m_bThreadRunFlag)
	{
		//1.epoll接收新连接,处理注册事件业务请求
		if (epoll() != VIOLET_SUCCESS)
			nInterval += 5000;
		else
			nInterval += 10;

		//2.清理超时连接,利用其epoll的超时时间作为参考,间隔约为30s
		if (nInterval > 30000)
		{
			clearTimeOutConnection();
			nInterval= 0;
		}
		PUB_Sleep(2);
	}
	return VIOLET_SUCCESS;
}
예제 #8
0
파일: SSLClient.cpp 프로젝트: dulton/proxy
int	CSSLClient::SSLConnect(SWL_socket_t sockfd, bool bVerifyPeer, const char *pHost, const char *pCertFile, \
						   const char *pPriteKeyFile, const char *pCAPath, const char *pCAFile, const char *pPassWd)
{
	s_Lock.Lock();
	if (!s_bHasInitial)
	{
		printf("ssl not initial\n");
		s_Lock.UnLock();
		return -1;
	}
	s_Lock.UnLock();
	
	if (pCertFile!=NULL && pPriteKeyFile!=NULL)
	{
		if (pCAPath)
		{
			if(SSL_CTX_load_verify_locations(s_SSLCTX, pCAFile, NULL) <= 0)
			{
				printf("Failed to set CA location...\n");
				return -1;
			}
		}
		if (SSL_CTX_use_certificate_file(s_SSLCTX, pCertFile, SSL_FILETYPE_PEM) <= 0) 
		{
			printf("%s %s %d failed\n", __FILE__, __FUNCTION__, __LINE__);
			int errNum = ERR_get_error();
			printf("%s:%s:%d, ssl connect error:%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_reason_error_string(errNum));
			printf("%s:%s:%d, error function=%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_func_error_string(errNum));
			return -1;
		}
		if (pPassWd)
		{
			SSL_CTX_set_default_passwd_cb_userdata(s_SSLCTX, (void*)pPassWd);
		}
		if (SSL_CTX_use_PrivateKey_file(s_SSLCTX, pPriteKeyFile, SSL_FILETYPE_PEM) <= 0) 
		{
			printf("%s %s %d failed\n", __FILE__, __FUNCTION__, __LINE__);
			int errNum = ERR_get_error();
			printf("%s:%s:%d, ssl connect error:%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_reason_error_string(errNum));
			printf("%s:%s:%d, error function=%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_func_error_string(errNum));
			return -1;
		}

		if (!SSL_CTX_check_private_key(s_SSLCTX)) 
		{
			printf("%s %s %d failed\n", __FILE__, __FUNCTION__, __LINE__);
			int errNum = ERR_get_error();
			printf("%s:%s:%d, ssl connect error:%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_reason_error_string(errNum));
			printf("%s:%s:%d, error function=%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_func_error_string(errNum));
			return -1;
		}
	}

	if (NULL == m_pSSL)
	{
		if (bVerifyPeer)
		{
			SSL_CTX_set_verify(s_SSLCTX, SSL_VERIFY_PEER, VerifyCallBack);
		}
		m_pSSL = SSL_new(s_SSLCTX);
		if (NULL == m_pSSL)
		{
			printf("ssl new err\n");
			return -1;
		}
	}

	if (1 != SSL_set_fd(m_pSSL, sockfd))
	{
		int errNum = ERR_get_error();
		printf("%s:%s:%d, ssl connect error:%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_reason_error_string(errNum));
		printf("%s:%s:%d, error function=%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_func_error_string(errNum));
		return -1;
	}
	SSL_set_connect_state(m_pSSL);

	unsigned long reTry = 0; 
	int ret = 0, err = 0;
	while(reTry++ < SSL_SOCKET_CONNECT_RETRIES)
	{
		if((ret = SSL_connect(m_pSSL)) == 1)
		{
			break;
		}
		err = SSL_get_error(m_pSSL, ret);
		if(SSL_ERROR_WANT_CONNECT == err || SSL_ERROR_WANT_READ == err || SSL_ERROR_WANT_WRITE == err)
		{
			PUB_Sleep(10); // wait a while
		}
		else
		{
			printf("SSL_connect Err : %d\n", err);
			int errNum = ERR_get_error();
			printf("%s:%s:%d, ssl connect error:%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_reason_error_string(errNum));
			printf("%s:%s:%d, error function=%s\n", __FUNCTION__, __FILE__, __LINE__, ERR_func_error_string(errNum));
			FreeRsource();
			return -1;
		}
	}
	if (reTry >= SSL_SOCKET_CONNECT_RETRIES)
	{
		printf("reTry >= SSL_SOCKET_CONNECT_RETRIES\n");
		FreeRsource();
		return -1;
	}

	if (pHost)
	{
		if (PostConnectCheck(m_pSSL, pHost) < 0)
		{
			return -1;
		}
	}
	
	return 0;
}
예제 #9
0
//创建socket,并开始监听端口,创建accept线程,accept线程结束的时候socket被销毁
//return value: 0 成功  1 创建socket失败 2 获取主机名或者获取主机IP地址失败
//				3 绑定socket失败  4 监听失败  5 创建监听线程失败
//				6 已经开始了监听
int CSWL_ListenProcEx::StartListen(unsigned short int nPort)
{
	//本函数StartListen的返回结果
	int iReturn = 0;
	int iLoop = 0;
	CPUB_LockAction   FunctionLock(&m_ListenLock); //给函数加了锁

	//如果已经开始了监听,则直接返回
	if (m_bListenStart)
	{
		iReturn = 6;
		goto StartListen_end;
	}

#ifdef __CUSTOM_IPV6__
	m_SocketListen = CreateIPV6Socket(nPort);
#else
	m_SocketListen = CreateIPV4Socket(nPort);
#endif
	if (SWL_INVALID_SOCKET == m_SocketListen)
	{
		iReturn = 1;
		goto StartListen_end;
	}
	
	//监听
	
	while(0 != SWL_Listen(m_SocketListen, 5/*SOMAXCONN*/))
	{
		++iLoop;
		if (iLoop < 12) 
		{
			SWL_PrintError(__FILE__,__LINE__);	
			PUB_Sleep(10000);
		}
		else
		{
			SWL_PrintError(__FILE__,__LINE__);		
			iReturn = 4;
			goto StartListen_end_close_sock;
		}	
	}

	//启动accept的线程
	m_AcceptThreadID = PUB_CreateThread(StartAccept, (void *)this, &m_bAcceptThreadRun);
	if( PUB_CREATE_THREAD_FAIL == m_AcceptThreadID )
	{
		PUB_PrintError(__FILE__,__LINE__);
		iReturn = 5;
		goto StartListen_end_close_sock;
	}

	//启动监听成功了
	iReturn = 0;
	m_bListenStart = true;
	goto StartListen_end;

	//在创建socket后,后面的阶段出错则要把创建的socket销毁
StartListen_end_close_sock:    
	SWL_CloseSocket(m_SocketListen);
	m_SocketListen = SWL_INVALID_SOCKET;
	
StartListen_end:
	return iReturn;
}
예제 #10
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;
}