亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? te_socket.cpp

?? 類似于flashget的下載軟件
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
////////////////////////////////////////////////////////////////////////////////
//	Copyright (C) 2000-2001 Softelf Inc. All rights reserved.
////////////////////////////////////////////////////////////////////////////////
//
//	Author	: Telan 
//	Date	: 2000-10-04
//	Purpose	: Encapsulate winsock2 functions to make it more easily used 
//	History	: 
//		1.0	: 2000-03-10 - First Edition of this source code ( called:FE_SOCKET )
//		2.0	: 2000-06-25 - Second Edition ( name changed to TE_SOCKET )
//						 - Add Error Control
//		3.0	: 2000-09-21 - Third Edition ( name changed to TE_SOCKET )
//						 - Change the errors' process mechanism
//						 - Add BufSocket Model
//						 - Add TE_ConnectEx(...)
//						 - Add TE_BSocketGetData(...) for specail usage
//		3.1 : 2000-10-04 - Add TE_AcceptEx(...)
//						 - Add TE_GetIP(...) to fix NT DNS resolve cache problem
//						 - Modify TE_ConnectEx
//						 - Fix several bugs in NetEvent process
//
//	Mailto	: telan@263.net ( Bugs' Report or Comments )
//	Notes	: This source code may be used in any form in any way you desire. It is
//			  provided "as is" without express or implied warranty. Use it at your own
//			  risk! The author accepts no liability for any damage/loss of business 
//			  that this product may cause.
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TE_Socket.h"

//需要ws2_32.lib庫
#pragma comment(lib,"ws2_32.lib")

//錯誤代號
static __declspec(thread) int _iThreadedErrorNo = 0;

// 輔助函數
//獲取最近一次操作的錯誤代碼
int TE_GetLastError()
{
	return (_iThreadedErrorNo);
}

//設置錯誤代碼
void TE_SetLastError(int iErrorCode)
{
	_iThreadedErrorNo = iErrorCode;
}

/////////////////////////////////////////////////////////////////////////
//		Winsock2 函數
/////////////////////////////////////////////////////////////////////////
//初始化Winsock2動態連接庫
int TE_InitLibrary()
{
	WSADATA         WSD;
	WORD wVersionRequired = MAKEWORD( TE_SOCKET_MAJOR_VERSION,TE_SOCKET_MINOR_VERSION );
	
	ZeroMemory(&WSD,sizeof(WSADATA));

	int nErrorNo = WSAStartup(wVersionRequired, &WSD);

	if ( SOCKET_SUCCESS != nErrorNo )
	{
		TE_SetLastError( nErrorNo );
		return ( SOCKET_ERROR );
	}

	if ( LOBYTE( WSD.wVersion ) != TE_SOCKET_MINOR_VERSION ||
		 HIBYTE( WSD.wVersion ) != TE_SOCKET_MAJOR_VERSION ) 
	{
		WSACleanup( );
		TE_SetLastError( WSAVERNOTSUPPORTED );
		return (SOCKET_ERROR); 
	}
 
	//成功初始化
	return (SOCKET_SUCCESS);
}


//釋放Winsock2動態連接庫
void TE_CleanupLibrary(void)
{
    WSACleanup();
}


//設置套接字屬性
int TE_SetSocketOption(SOCKET hSocket)
{

    int             iActivate = 1;

	//允許地址重用
    if (setsockopt(hSocket, SOL_SOCKET, SO_REUSEADDR, (const char *) &iActivate,sizeof(iActivate)) == SOCKET_ERROR )
    {
        TE_SetLastError( WSAGetLastError() );
        return (SOCKET_ERROR);
    }

	//  如果支持,設置KEEPALIVE屬性 (這樣做會帶來其他不良后果)
	//setsockopt(hSocket, SOL_SOCKET, SO_KEEPALIVE, (const char *) &iActivate,sizeof(iActivate));

	return (SOCKET_SUCCESS);
}

//創建具有重疊IO能力的套接字
SOCKET TE_CreateSocket(int iAddressFamily /*= AF_INET*/, int iType/*= SOCK_STREAM*/,int iProtocol/*= 0*/)
{
	SOCKET hSocket = WSASocket(iAddressFamily, iType, iProtocol, NULL,0,WSA_FLAG_OVERLAPPED);
	if ( hSocket == INVALID_SOCKET )
	{
		TE_SetLastError( WSAGetLastError() );
		return (INVALID_SOCKET);
	}

	//設置套接字選項
	if ( SOCKET_ERROR == TE_SetSocketOption(hSocket) )	//設置屬性失敗
	{
		TE_CloseSocket(hSocket, TRUE);
		return (INVALID_SOCKET);
	}
	return (hSocket);
}


//關閉套接字
void TE_CloseSocket(SOCKET hSocket, BOOL bHardClose)
{
	// 不需要捕獲錯誤
	if (!bHardClose) // 優雅關閉 Graceful close
	{
		// 不再發送數據,對于TCP套接字,在所有的數據都發送完畢之后,
		// 將發送一個 FIN ,通知接收方所有數據已經發送完畢。
		shutdown(hSocket, SD_SEND);

		// 接收緩沖區有可能還有未接收的數據,在關閉套接字之前應該先
		// 讀取殘留的數據。
		int		iRecvResult;
		HANDLE	hSocketEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
		char	szBuffer[256];
		do
		{
			if (hSocketEvent != NULL)
			{
				//注冊網絡事件
				WSAEventSelect(hSocket, (WSAEVENT) hSocketEvent, FD_READ | FD_CLOSE);
				WSAWaitForMultipleEvents(1, &hSocketEvent, TRUE,TE_SHUTDOWN_RECV_TIMEOUT, TRUE);
				//清除網絡事件
				WSAEventSelect(hSocket, (WSAEVENT) hSocketEvent, 0);
			}
			ZeroMemory(szBuffer,256);
			iRecvResult = TE_RecvLL(hSocket, szBuffer, sizeof(szBuffer));
		} while (iRecvResult > 0);

		if (hSocketEvent != NULL)
			CloseHandle(hSocketEvent);

		//不再允許接收和發送
		shutdown(hSocket, SD_BOTH);
	}
	
	// 關閉套接字
	closesocket(hSocket);
}


// 一次性接收數據(重疊IO)
int TE_RecvLL(SOCKET hSocket, char *pszBuffer, int iBufferSize)
{
	DWORD		dwRtxBytes = 0,
				dwRtxFlags = 0;
	WSABUF		WSABuff;

	//清空緩沖
	ZeroMemory(&WSABuff,sizeof(WSABUF));

	WSABuff.len = iBufferSize;
	WSABuff.buf = pszBuffer;

	return ((WSARecv(hSocket, &WSABuff, 1, &dwRtxBytes, &dwRtxFlags,NULL, NULL) == SOCKET_SUCCESS) ? (int) dwRtxBytes : -WSAGetLastError());
}

// 接收數據(阻塞直至收到數據為止)
int TE_RecvData(SOCKET hSocket, char *pszBuffer, int iBufferSize, DWORD dwTimeout)
{
	HANDLE hReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

	if (hReadEvent == NULL)
	{
		TE_SetLastError( (int)GetLastError() );
		return ( SOCKET_ERROR );
	}

	int		iRecvBytes = 0;
	DWORD	dwWaitResult ;
	for (;;)
	{
		// 注冊FD_READ | FD_CLOSE 事件 
		// (因為可能在等待FD_READ事件中,對方關閉套接字,所以要關注FD_CLOSE)
		if( WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, FD_READ | FD_CLOSE) == SOCKET_ERROR)
		{
			CloseHandle(hReadEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
	
		// 等等FD_READ | FD_CLOSE事件的發生
		dwWaitResult = WSAWaitForMultipleEvents(1, &hReadEvent, TRUE,dwTimeout, TRUE);

		if (dwWaitResult != WSA_WAIT_EVENT_0)
		{
			// 清除事件
			WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
			CloseHandle(hReadEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		
		////////////////////////////////////////////////////////////// 
		///	注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也應該 
		///			進一步檢查網絡是否發生錯誤
		///////////////////////////////////////////////////////////////
		WSANETWORKEVENTS NetEvent;
		if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hReadEvent,&NetEvent) == SOCKET_ERROR)
		{
			// 清除事件
			WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
			CloseHandle(hReadEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		//判斷發生了什么事件 FD_READ 或 FD_CLOSE	
		if( ( NetEvent.lNetworkEvents == FD_CLOSE ) ||
			 ( NetEvent.lNetworkEvents	== FD_READ && 
			   NetEvent.iErrorCode[FD_READ_BIT] !=0 ) )	// 發生錯誤
		{
			// 清除事件
			WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
			CloseHandle(hReadEvent);
			TE_SetLastError(WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		////////////////////////////////////////////////////////////////
		// 清除事件
		WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
	
		// 接收數據
		if ((iRecvBytes = TE_RecvLL(hSocket, pszBuffer, iBufferSize)) >= 0)
			break;	// 跳出循環

		int iErrorCode = -iRecvBytes;

		if ( iErrorCode != WSAEWOULDBLOCK )	//太多的未完成重疊操作
		{
			CloseHandle(hReadEvent);
			TE_SetLastError( iErrorCode );
			return (SOCKET_ERROR);
		}

		//阻塞住了
		////////////////////////////////////////////////////////////////////////
		//  如果發生阻塞,就等待一定時間后重試,以免CPU輪詢浪費時間
		////////////////////////////////////////////////////////////////////////
		Sleep(TE_BLOCKED_SNDRCV_SLEEP);
    }

    CloseHandle(hReadEvent);
    return (iRecvBytes);
}


// 接收數據直至達到規定的長度(緩沖區滿)或超時或沒有數據可讀取時
int TE_Recv(SOCKET hSocket, char *pszBuffer, int iBufferSize, DWORD dwTimeout)
{
	int	iRtxBytes	= 0;
	int iRtxCurrent	= 0;

	while (iRtxBytes < iBufferSize)
	{
		iRtxCurrent = TE_RecvData(hSocket, (pszBuffer + iRtxBytes),(iBufferSize - iRtxBytes), dwTimeout);

		if (iRtxCurrent < 0)	//沒有數據可讀取
			return (iRtxBytes);

		iRtxBytes += iRtxCurrent;
	}

	return (iRtxBytes);
}


//一次性發送數據(重疊IO)
int TE_SendLL(SOCKET hSocket, char const * pszBuffer, int iBufferSize)
{
	DWORD	dwRtxBytes = 0;
	WSABUF	WSABuff;

	ZeroMemory(&WSABuff,sizeof(WSABUF));
	WSABuff.len = iBufferSize;
	WSABuff.buf = (char *) pszBuffer;

	return ((WSASend(hSocket, &WSABuff, 1, &dwRtxBytes, 0,NULL, NULL) == SOCKET_SUCCESS) ? (int) dwRtxBytes : -WSAGetLastError());

}

// 發送數據
int TE_SendData(SOCKET hSocket, char const * pszBuffer, int iBufferSize, DWORD dwTimeout)
{

	HANDLE	hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

	if (hWriteEvent == NULL)
	{
		TE_SetLastError( (int)GetLastError() );
		return (SOCKET_ERROR);
	}

	int iSendBytes = 0;

	for (;;)
	{
		////////////////////////////////////////////////////////////////
		// 發送數據成功
		if ((iSendBytes = TE_SendLL(hSocket, pszBuffer, iBufferSize)) >= 0)
			break;

		int iErrorCode = -iSendBytes;

		if (iErrorCode != WSAEWOULDBLOCK)
		{
			CloseHandle(hWriteEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}

		
		///////////////////////////////////////////////////////////////////////////////
		//  睡眠一段時間
		///////////////////////////////////////////////////////////////////////////////
		Sleep(TE_BLOCKED_SNDRCV_SLEEP);


		// 注冊FD_WRITE | FD_CLOSE 事件
		if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE|FD_CLOSE) == 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.lNetworkEvents == FD_CLOSE ) ||
			 ( NetEvent.lNetworkEvents == FD_WRITE   &&
				NetEvent.iErrorCode[FD_WRITE_BIT] !=0 ) )	// 發生錯誤
		{
			// 清除網絡事件
			WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
			CloseHandle(hWriteEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		// 清除網絡事件
		WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
   }

    CloseHandle(hWriteEvent);
    return (iSendBytes);
}

//發送完所有數據或超時
int TE_Send(SOCKET hSocket, char const * pszBuffer, int iBufferSize, DWORD dwTimeout)
{

	int iRtxBytes	= 0;
	int iRtxCurrent = 0;

	while (iRtxBytes < iBufferSize)
	{
		iRtxCurrent = TE_SendData(hSocket, (pszBuffer + iRtxBytes),(iBufferSize - iRtxBytes), dwTimeout);
		if (iRtxCurrent < 0)
			return (iRtxBytes);

		iRtxBytes += iRtxCurrent;
	}
	return (iRtxBytes);
}

// 建立連接
int TE_Connect(SOCKET hSocket, const struct sockaddr * pSocketAddress, int iNameLen,DWORD dwTimeout)
{

	HANDLE hConnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

	if (hConnectEvent == NULL)
	{
		TE_SetLastError( (int)GetLastError() );
		return (SOCKET_ERROR);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
综合电影一区二区三区 | 日韩中文字幕av电影| 麻豆中文一区二区| 91美女在线视频| 久久夜色精品国产噜噜av| 亚洲v日本v欧美v久久精品| 国产99精品国产| 日韩亚洲欧美在线| 亚洲一区二区三区美女| 成人精品在线视频观看| 日韩免费观看高清完整版在线观看| 国产精品女主播在线观看| 久久黄色级2电影| 欧美日韩久久一区| 一级精品视频在线观看宜春院| 国产精品一区二区x88av| 日韩写真欧美这视频| 亚洲国产中文字幕| 在线观看视频欧美| 一区二区三区在线观看动漫| 成人av小说网| 国产精品欧美久久久久无广告 | 高清在线观看日韩| 欧美精品一区二区三区蜜桃视频| 日韩精品视频网站| 制服丝袜在线91| 视频一区视频二区中文| 欧美日韩亚州综合| 亚洲3atv精品一区二区三区| 91精品福利视频| 亚洲一区二区三区四区在线观看 | 日韩福利电影在线| 欧美另类高清zo欧美| 视频一区免费在线观看| 欧美日韩精品系列| 青青草成人在线观看| 欧美一级高清片在线观看| 亚洲成人tv网| 日韩午夜小视频| 久久99精品国产.久久久久久| 日韩精品一区二区在线观看| 狠狠久久亚洲欧美| 国产精品色噜噜| 91福利小视频| 日本欧美一区二区| 精品对白一区国产伦| 国产成人精品免费| 亚洲色图视频网| 欧美四级电影在线观看| 日本美女一区二区三区| 精品国产免费久久| 99综合影院在线| 亚洲综合免费观看高清完整版| 欧美日韩一区二区在线观看视频 | 日韩女优av电影| 国产成人午夜99999| 亚洲视频在线观看三级| 91国偷自产一区二区开放时间| 性久久久久久久久| 久久久久久久久岛国免费| 99久精品国产| 麻豆国产一区二区| 综合久久久久久| 日韩一区二区在线观看视频| 丁香婷婷综合激情五月色| 夜夜精品视频一区二区| 欧美精品一区二区三区蜜臀| 99精品欧美一区二区三区综合在线| 亚洲一区二区偷拍精品| 久久久久久久av麻豆果冻| 91麻豆文化传媒在线观看| 久久狠狠亚洲综合| 亚洲影视资源网| 国产欧美一区二区三区沐欲| 欧美综合一区二区| 国产精品亚洲第一区在线暖暖韩国 | 亚洲色图丝袜美腿| 亚洲精品在线观看网站| 色www精品视频在线观看| 国内精品伊人久久久久影院对白| 亚洲精品视频在线观看免费| 日韩美女天天操| 欧美视频一区二| 成人午夜视频在线观看| 免费精品视频在线| 一区二区三区**美女毛片| 欧美国产丝袜视频| 日韩视频免费观看高清完整版在线观看| 大陆成人av片| 国模大尺度一区二区三区| 亚洲午夜电影网| 亚洲欧美一区二区三区孕妇| 久久综合精品国产一区二区三区| 欧美久久久久久久久久| 色综合久久久久综合体桃花网| 国产成人在线视频播放| 久久精品99国产精品日本| 日韩av不卡一区二区| 香蕉成人啪国产精品视频综合网| 日韩理论片网站| 中文字幕亚洲一区二区va在线| 国产亚洲视频系列| 精品国产在天天线2019| 91精品国产色综合久久不卡蜜臀| 色成年激情久久综合| www.视频一区| 94-欧美-setu| 91美女蜜桃在线| 一本色道久久综合精品竹菊| 波多野结衣欧美| 96av麻豆蜜桃一区二区| 9色porny自拍视频一区二区| 成人高清免费观看| 不卡一区二区三区四区| 91污片在线观看| 色美美综合视频| 欧美日韩亚洲高清一区二区| 欧美日韩高清在线| 3d成人动漫网站| www亚洲一区| 国产肉丝袜一区二区| 亚洲国产精品成人综合| 国产精品视频线看| 夜夜精品浪潮av一区二区三区| 亚洲精品老司机| 性做久久久久久| 久久精品免费看| 成人午夜在线播放| 91美女在线看| 9191成人精品久久| 久久亚洲一级片| 日韩美女精品在线| 亚洲福利电影网| 精品一区二区三区在线播放 | 五月婷婷激情综合| 免费不卡在线观看| 国产 欧美在线| 在线免费不卡视频| 欧美xxxxx牲另类人与| 久久综合成人精品亚洲另类欧美| 国产精品欧美精品| 亚洲国产日韩综合久久精品| 另类小说色综合网站| 成人免费视频视频| 欧美久久婷婷综合色| 久久久国产午夜精品| 亚洲欧美一区二区三区极速播放 | 国产a精品视频| 91国产成人在线| 国产三级欧美三级| 亚洲二区在线观看| 国产一区二区福利视频| 欧美自拍偷拍午夜视频| 久久久99久久精品欧美| 亚洲综合男人的天堂| 国产精品一区二区久久不卡| 色噜噜久久综合| 久久免费看少妇高潮| 亚洲成年人影院| av影院午夜一区| 精品国产乱码久久久久久久久| 一区二区成人在线| 国产91丝袜在线播放| 日韩美女视频在线| 一区二区三区四区乱视频| 国产精品99久| 日韩欧美国产一区在线观看| 亚洲人成精品久久久久久 | 97精品国产露脸对白| 欧美不卡一二三| 亚洲国产精品尤物yw在线观看| 国产精品一级在线| 日韩欧美国产成人一区二区| 一区二区三区在线视频播放| 成人综合在线观看| 亚洲精品在线网站| 青娱乐精品视频在线| 欧美日韩国产高清一区二区三区 | 99久久精品国产一区| 精品处破学生在线二十三| 亚洲国产综合人成综合网站| 97久久精品人人澡人人爽| 欧美高清在线一区二区| 国内国产精品久久| 欧美mv日韩mv国产网站| 日本vs亚洲vs韩国一区三区| 欧美午夜一区二区| 亚洲一区在线观看免费| 色综合中文综合网| 91麻豆swag| 亚洲日本中文字幕区| 成人av免费在线| 国产精品久久久久影院老司 | 91精品国产综合久久蜜臀| 亚洲最新视频在线观看| 在线观看一区不卡| 亚洲国产精品视频| 欧美嫩在线观看| 蜜桃视频第一区免费观看| 日韩视频一区二区三区|