⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 te_socket.cpp

📁 类似于flashget的下载软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		//////////////////////////////////////////////////////////////////////////
		//	睡眠一段时间
		/////////////////////////////////////////////////////////////////////////
		Sleep(TE_BLOCKED_SNDRCV_SLEEP);

		// 注册FD_WRITE事件  
		if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE) == SOCKET_ERROR)
		{
			CloseHandle(hWriteEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hWriteEvent, TRUE,dwTimeout, TRUE);
		
		if( dwWaitResult != WSA_WAIT_EVENT_0 )
		{
			// 注销事件
			WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
			CloseHandle(hWriteEvent);
			TE_SetLastError(  WSAGetLastError() );
			return (SOCKET_ERROR);
		}

		////////////////////////////////////////////////////////////// 
		///	注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
		///			进一步检查网络是否发生错误
		///////////////////////////////////////////////////////////////
		WSANETWORKEVENTS NetEvent;
		if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hWriteEvent,&NetEvent) == SOCKET_ERROR)
		{
			// 注销事件
			WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
			CloseHandle(hWriteEvent);
			TE_SetLastError(  WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		if(NetEvent.iErrorCode[FD_WRITE_BIT] !=0 )	// 发生错误
		{
			// 注销事件
			WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
			CloseHandle(hWriteEvent);
			TE_SetLastError(NetEvent.iErrorCode[FD_WRITE_BIT]);
			return (SOCKET_ERROR);
		}
		////////////////////////////////////////////////////////////////
		// 注销事件
		WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
	}

	CloseHandle(hWriteEvent);
	return ((int) dwRtxBytes);
}



////////////////////////////////////////////////////////////////////////////////
//
//	BSocket函数
//
////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//		功能: 绑定套接字
//		参数: 
//				hSocket		-- SOCKET(待绑定套接字)
//				iBufferSize	-- 缓冲区长度(缺省为TE_SOCKET_BUFFER_SIZE)
//		返回: 
//				结构指针(失败时为NULL)
//
////////////////////////////////////////////////////////////////////////////////
PBSD TE_BSocketAttach(SOCKET hSocket, int iBufferSize /* = TE_SOCKET_BUFFER_SIZE */ )
{

	if( hSocket == INVALID_SOCKET)
		return NULL;

	// 分配内存
	PBSD pBSD = (PBSD) malloc(sizeof(BSD));

	if (pBSD == NULL)
		return NULL;

	char *pszBuffer = (char *) malloc(iBufferSize);

	if (pszBuffer == NULL)
	{
		free(pBSD);
		return NULL;
	}

	// 设置结构成员
	ZeroMemory(pBSD,sizeof(BSD));
	ZeroMemory(pszBuffer,iBufferSize);

	pBSD->hSocket			= hSocket;
	pBSD->iBufferSize		= iBufferSize;
	pBSD->pszBuffer			= pszBuffer;
	pBSD->iBytesInBuffer	= 0;
	pBSD->iReadIndex		= 0;
	pBSD->iBufferIndex		= 0;

	return pBSD;
}

////////////////////////////////////////////////////////////////////////////
//
//		功能: 解开套接字
//		参数: 
//				pBSD				--	BufSocketData结构指针
//				bCloseSocket		--	是否在解开套接字同时关闭套接字(缺省为FALSE)
//		返回: 
//				若bCloseSocket为FALSE,返回解开的套接字
//				若bCloseSocket为TRUE ,返回INVALID_SOCKET
//
///////////////////////////////////////////////////////////////////////////
SOCKET TE_BSocketDetach(PBSD pBSD, BOOL bCloseSocket /* = FALSE */ )
{
	SOCKET		 hSocket = pBSD->hSocket;

	// 释放内存
	free(pBSD->pszBuffer);
	free(pBSD);

	// 是否关闭套接字
	if (bCloseSocket)
	{
		TE_CloseSocket(hSocket);
		return (INVALID_SOCKET);
	}
	return (hSocket);
}


////////////////////////////////////////////////////////////////////
//
//		功能: 从缓冲区读取数据
//		参数: 
//				pBSD		 -- BufSocketData结构指针
//				dwTimeOut	 -- 接收超时(缺省为TE_RECV_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
////////////////////////////////////////////////////////////////////
int TE_BSocketReadData(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
	// 计算缓冲区空闲区域
	int	iMaxRead = pBSD->iBufferSize - pBSD->iBytesInBuffer;
	char  *pszBuffer = (char *) malloc(iMaxRead + 1);

	if (pszBuffer == NULL)
		return (SOCKET_ERROR);
	
	// 清空
	ZeroMemory(pszBuffer,iMaxRead+1);

	// 接收数据
	int iReadedBytes = TE_RecvData(pBSD->hSocket, pszBuffer, iMaxRead, dwTimeout);

	if (iReadedBytes > 0)
	{
		int iHeadSize = Min(pBSD->iBufferSize - pBSD->iBufferIndex, iReadedBytes);

		if (iHeadSize > 0)
			memcpy(pBSD->pszBuffer + pBSD->iBufferIndex, pszBuffer, iHeadSize);

		pBSD->iBufferIndex += iHeadSize;

		if (pBSD->iBufferIndex == pBSD->iBufferSize)
			pBSD->iBufferIndex = 0;

		int iBackSize = iReadedBytes - iHeadSize;

		if (iBackSize > 0)
			memcpy(pBSD->pszBuffer + pBSD->iBufferIndex, pszBuffer + iHeadSize, iBackSize);

		pBSD->iBufferIndex += iBackSize;
		pBSD->iBytesInBuffer += iReadedBytes;
	}

	free(pszBuffer);
	return (iReadedBytes);
}


////////////////////////////////////////////////////////////////////
//
//		功能: 从缓冲区读取一个字符
//		参数: 
//				pBSD		 -- BufSocketData结构指针
//				dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)	
//		返回: 
//				一个字符(错误时返回TE_EOF)
//
////////////////////////////////////////////////////////////////////
int TE_BSocketGetChar(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
	if ((pBSD->iBytesInBuffer == 0) && (TE_BSocketReadData(pBSD, dwTimeout) <= 0))
		return (TE_EOF);

	int iChar =( (int) pBSD->pszBuffer[pBSD->iReadIndex]) & 0x000000ff;

	pBSD->iReadIndex = INext(pBSD->iReadIndex, pBSD->iBufferSize);

	--pBSD->iBytesInBuffer;

	return (iChar);
}


////////////////////////////////////////////////////////////////////////////
//
//		功能: 从缓冲区读取一行(注意,结尾的回车换行0x0D,0x0A并不包括在其中)
//		参数: 
//				pBSD		 -- BufSocketData结构指针
//				pszBuffer	 -- 接收缓冲区
//				iBufferSize	 -- 缓冲大小
//				iStatus		 -- 状态 (0:正常,1:缓冲不够,-1:错误)
//				dwTimeOut	 -- 接收超时(缺省为TE_RECV_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
////////////////////////////////////////////////////////////////////////////
int TE_BSocketGetString(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
	
	*iStatus = 1;		//缓冲长度不足

	int ii,iChar;
	for (ii = 0; ii < (iBufferSize - 1);)
	{
		iChar = TE_BSocketGetChar(pBSD, dwTimeout);
		if (iChar == TE_EOF)
		{
			*iStatus = (-1) ;
			return SOCKET_ERROR;
		}

		if (iChar == 0x0D)	// 回车符号
		{
			iChar = TE_BSocketGetChar(pBSD, dwTimeout);
			if (iChar == TE_EOF)
			{
				*iStatus = (-1);
				return (SOCKET_ERROR);
			}

			if (iChar == 0x0A)	// 换行
			{
				*iStatus = 0;	//正常情况
				break;
			}
			else
				pszBuffer[ii++] = 0x0D;
		}
		else
			pszBuffer[ii++] = (char) iChar;
	}
	pszBuffer[ii] = '\0';

	return (SOCKET_SUCCESS);
}

/////////////////////////////////////////////////////////////////////////////////////////
//
//		功能: 从缓冲区读取一行(包括单换行0x0A)(注意,结尾的回车换行不包括在其中)
//		参数: 
//				pBSD		-- BufSocketData结构指针
//				pszBuffer	 -- 接收缓冲区
//				iBufferSize	 -- 缓冲大小
//				iStatus		-- 状态 (0:正常,1:缓冲不够,-1:错误)
//				dwTimeOut	-- 接收超时(缺省为TE_RECV_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
//////////////////////////////////////////////////////////////////////////////////////////
int TE_BSocketGetStringEx(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
	
	*iStatus = 1;		//缓冲长度不足

	int ii,iChar;
	int LastChar = TE_EOF;
	for (ii = 0; ii < (iBufferSize - 1);)
	{
		iChar = TE_BSocketGetChar(pBSD, dwTimeout);

		if (iChar == TE_EOF)
		{
			*iStatus = (-1) ;
			return SOCKET_ERROR;
		}

		if (iChar == 0x0A)	// 换行符号
		{
			*iStatus = 0;	//正常情况
			if (LastChar == 0x0D)
				ii-- ;	
			break;
		}
		else
			pszBuffer[ii++] = (char) iChar;

		LastChar = iChar;
			
	}
	pszBuffer[ii] = '\0';

	return (SOCKET_SUCCESS);
}



////////////////////////////////////////////////////////////////////
//
//		功能: 发送一行 : 自动在最后加上“回车换行符(0x0D,0x0A)”
//		参数: 
//				pBSD		-- BufSocketData结构指针
//				pszBuffer	-- 待发送字符串
//				dwTimeOut	-- 发送超时(缺省为TE_SEND_TIMEOUT)	
//		返回: 
//				 0	---	成功 (SOCKET_SUCCESS)
//				-1	---	失败 (SOCKET_ERROR)	
//
////////////////////////////////////////////////////////////////////
int TE_BSocketSendString(PBSD pBSD, const char *pszBuffer, DWORD dwTimeout /* = TE_SEND_TIMEOUT */ )
{

	char *pszSendBuffer = (char *) malloc(strlen(pszBuffer) + 3);

	if (pszSendBuffer == NULL)
		return (SOCKET_ERROR);

	ZeroMemory( pszSendBuffer,strlen(pszBuffer) + 3);
	sprintf(pszSendBuffer, "%s\r\n", pszBuffer);

	int iSendLength = strlen(pszSendBuffer);
	if (TE_Send(pBSD->hSocket, pszSendBuffer, iSendLength, dwTimeout) != iSendLength)
	{
        free(pszSendBuffer);
		return (SOCKET_ERROR);
    }
	free(pszSendBuffer);
	return (iSendLength);
}


////////////////////////////////////////////////////////////////////
//
//		功能: 获取套接字
//		参数: 
//				pBSD -- BufSocketData结构指针
//		返回: 
//				与此结构绑定在一起的SOCKET	
//
////////////////////////////////////////////////////////////////////
SOCKET TE_BSocketGetAttachedSocket(PBSD pBSD)
{
	return (pBSD->hSocket);
}

////////////////////////////////////////////////////////////////////
//
//		功能: 从缓冲区读取一定数量的数据
//		参数: 
//				pBSD		 -- BufSocketData结构指针
//				pszBuffer	 -- 接收缓冲区
//				iBufferSize	 -- 缓冲大小
//				dwTimeOut	 -- 接收超时(缺省为TE_RECV_TIMEOUT)	
//		返回: 
//				读的数据的字节数
////////////////////////////////////////////////////////////////////
int TE_BSocketGetData(PBSD pBSD, char *pszBuffer, int iBufferSize,DWORD dwTimeout /*= TE_RECV_TIMEOUT*/)
{
	int iReadBytes	 = 0;
	int iHeadSize,iBackSize;

	if ((pBSD->iBytesInBuffer == 0) && (TE_BSocketReadData(pBSD, dwTimeout) <= 0))
		return 0; 

	if( pBSD->iBytesInBuffer < iBufferSize ) // 数据不够多
	{
		iHeadSize = Min( pBSD->iBufferSize - pBSD->iReadIndex ,pBSD->iBytesInBuffer );
		memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iHeadSize);
			
		pBSD->iReadIndex += iHeadSize;
		if( pBSD->iReadIndex == pBSD->iBufferSize )
			pBSD->iReadIndex = 0;

		iReadBytes += iHeadSize;
		iBackSize = pBSD->iBytesInBuffer - iHeadSize;
			
		if( iBackSize > 0)
			memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iBackSize);

		iReadBytes			 += iBackSize;
		pBSD->iReadIndex	 += iBackSize;
		pBSD->iBytesInBuffer = 0; // 数据全部读完
	}
	else // 这次的数据足够多了
	{
		iHeadSize = Min( pBSD->iBufferSize - pBSD->iReadIndex,iBufferSize - iReadBytes );
		memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iHeadSize);
			
		pBSD->iReadIndex += iHeadSize;
		if( pBSD->iReadIndex == pBSD->iBufferSize )
			pBSD->iReadIndex = 0;

		iReadBytes += iHeadSize;
		iBackSize = iBufferSize - iReadBytes;

		if( iBackSize > 0)
			memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iBackSize);

		iReadBytes			 += iBackSize;
		pBSD->iReadIndex	 += iBackSize;
		pBSD->iBytesInBuffer -= (iHeadSize+iBackSize);
	}
	return iReadBytes;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -