亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
成人免费视频网站在线观看| 亚洲电影在线播放| 激情都市一区二区| 精品国产三级电影在线观看| 国产综合色产在线精品| 国产亚洲视频系列| 国产成人亚洲综合a∨婷婷图片| 国产欧美日本一区二区三区| 成人激情电影免费在线观看| 亚洲天堂2016| 欧美日韩亚洲国产综合| 青青草一区二区三区| 久久久美女艺术照精彩视频福利播放| 国产成人在线视频网址| 一级女性全黄久久生活片免费| 欧美日韩激情在线| 国产一区二区0| 亚洲欧美色综合| 日韩一区二区视频| 国产成人一级电影| 亚洲一区在线观看视频| 欧美电视剧在线看免费| 色综合久久久久综合体桃花网| 日韩电影网1区2区| 亚洲天堂久久久久久久| 日韩一卡二卡三卡| 成人国产精品免费观看| 奇米亚洲午夜久久精品| 国产日产精品一区| 欧美人妖巨大在线| 天天操天天综合网| 六月婷婷色综合| 成人一级片网址| 欧美本精品男人aⅴ天堂| 91成人免费在线| 久久99国产精品久久99| 亚洲国产激情av| 制服丝袜亚洲色图| 成人激情图片网| 麻豆极品一区二区三区| 日韩毛片精品高清免费| 精品日韩av一区二区| 91成人在线观看喷潮| 国产91精品精华液一区二区三区| 午夜欧美在线一二页| 日本一区二区三区四区| 日韩午夜中文字幕| 欧美日韩第一区日日骚| 成人激情av网| 国产在线视频一区二区| 婷婷综合久久一区二区三区| 一区二区三区日韩精品| 天天色天天爱天天射综合| 欧美日韩国产免费一区二区| 成人激情免费网站| 国产麻豆视频一区| 日日摸夜夜添夜夜添国产精品| 亚洲特级片在线| 中文字幕第一区二区| 337p日本欧洲亚洲大胆精品| 欧美日韩一级视频| 一本到三区不卡视频| 成人激情动漫在线观看| 国产成人欧美日韩在线电影| 老司机午夜精品99久久| 日本中文一区二区三区| 亚洲午夜精品久久久久久久久| 亚洲天堂成人在线观看| 中文字幕一区二区三区在线播放| 日本一区二区免费在线| 国产亚洲欧美日韩在线一区| 日韩欧美成人一区二区| 日韩小视频在线观看专区| 69精品人人人人| 91精品国产综合久久久久久 | 亚洲成av人片一区二区三区 | 精品国产乱码久久久久久老虎| 69堂国产成人免费视频| 91精品午夜视频| 日韩欧美中文一区| 日韩欧美在线1卡| 精品国产一区二区三区久久影院 | 亚洲精品一二三| 亚洲色图视频免费播放| 免费不卡在线观看| 午夜精品久久久久久久99水蜜桃 | 日韩免费成人网| 欧美电影免费观看高清完整版在线| 日韩一区二区三| 欧美电影免费观看高清完整版在| 26uuu精品一区二区| 国产丝袜美腿一区二区三区| 欧美国产禁国产网站cc| 亚洲日本va在线观看| 亚洲一区二区视频在线观看| 亚洲a一区二区| 麻豆成人av在线| 国产成人免费视| 91视频.com| 欧美一级理论片| 久久久久久99久久久精品网站| 欧美国产乱子伦| 亚洲综合激情网| 精彩视频一区二区三区| 国产一本一道久久香蕉| 丁香另类激情小说| 欧美性生活大片视频| 日韩一区二区高清| 国产精品成人免费在线| 香蕉影视欧美成人| 韩国女主播一区| 色悠悠久久综合| 久久综合九色综合欧美98 | 久久精品人人做人人爽人人| 亚洲欧洲日韩一区二区三区| 亚洲国产三级在线| 国产精品自拍av| 在线精品视频一区二区三四| 久久在线免费观看| 亚洲一区二区三区四区在线| 久久超碰97中文字幕| 一本色道久久综合狠狠躁的推荐| 欧美电影免费观看高清完整版在线 | 国产精品免费视频观看| 亚洲成人一区在线| 成人一区在线观看| 欧美日本韩国一区| 亚洲欧洲色图综合| 激情六月婷婷久久| 欧美亚洲愉拍一区二区| 国产欧美一区二区精品秋霞影院 | 色噜噜狠狠色综合欧洲selulu| 日韩限制级电影在线观看| 亚洲免费观看高清完整版在线观看熊| 伦理电影国产精品| 欧美三级日本三级少妇99| 国产精品午夜久久| 久久精品国产久精国产| 在线亚洲高清视频| 国产精品亲子乱子伦xxxx裸| 裸体一区二区三区| 51精品视频一区二区三区| 18欧美亚洲精品| 国产69精品久久99不卡| 欧美成人综合网站| 日韩av一区二区三区四区| 在线精品视频一区二区三四| 国产精品盗摄一区二区三区| 国产精品一区二区久激情瑜伽| 91精品蜜臀在线一区尤物| 亚洲午夜三级在线| 色婷婷久久综合| 亚洲欧美日韩国产另类专区| 粉嫩在线一区二区三区视频| 久久在线免费观看| 国产综合久久久久久鬼色| 日韩一级完整毛片| 亚洲欧洲另类国产综合| 久久久亚洲高清| 亚洲人成伊人成综合网小说| 国产a精品视频| 欧美国产日韩a欧美在线观看 | 紧缚奴在线一区二区三区| 欧美精品视频www在线观看| 亚洲无线码一区二区三区| 色猫猫国产区一区二在线视频| 亚洲精品国久久99热| 99re这里都是精品| **欧美大码日韩| 99免费精品视频| 一区二区三区高清| 欧美日韩一区在线| 日韩电影在线看| 精品国产乱码久久久久久免费 | 国产精品入口麻豆九色| 成人动漫中文字幕| 亚洲精品国产一区二区三区四区在线| 91免费视频网址| 亚洲成人免费看| 日韩三区在线观看| 国产精品影视在线| 国产精品国产自产拍高清av| 91麻豆福利精品推荐| 午夜精品福利一区二区蜜股av| 日韩一二三区不卡| 国产丶欧美丶日本不卡视频| 成人欧美一区二区三区| 欧美三级乱人伦电影| 老司机精品视频在线| 国产精品青草综合久久久久99| 在线中文字幕一区| 日本伊人精品一区二区三区观看方式| 精品动漫一区二区三区在线观看| 国产高清精品网站| 夜夜精品视频一区二区| 欧美一级夜夜爽| 99免费精品在线| 麻豆精品新av中文字幕| 国产精品久久久久久久久动漫| 精品视频在线看|