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

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

?? te_socket.cpp

?? 用VC編寫的HTTP下載的win32程序
?? 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先锋影音| 美美哒免费高清在线观看视频一区二区 | 精品成人私密视频| 在线观看中文字幕不卡| 国产高清不卡二三区| 日本免费新一区视频| 亚洲精品免费视频| 国产女同性恋一区二区| 日韩久久精品一区| 欧美日韩亚洲综合在线 | 亚洲综合色在线| 国产蜜臀97一区二区三区| 欧美一三区三区四区免费在线看| 色综合久久99| youjizz国产精品| 国产白丝网站精品污在线入口| 日韩国产一二三区| 日韩一区精品视频| 亚洲第一主播视频| 亚洲第一主播视频| 亚洲第一av色| 亚洲第一福利一区| 亚洲综合免费观看高清完整版| 中文字幕欧美一区| 国产精品国产自产拍在线| 日本一区二区三区四区在线视频| 2021久久国产精品不只是精品| 日韩三级免费观看| 日韩美女一区二区三区| 日韩精品一区二区三区四区| 91精品国产麻豆国产自产在线| 欧美美女一区二区三区| 欧美精品在欧美一区二区少妇| 在线视频国产一区| 欧美综合一区二区| 欧美日韩久久一区二区| 欧美精三区欧美精三区| 欧美精品色一区二区三区| 7777精品伊人久久久大香线蕉的 | 五月天欧美精品| 亚洲国产精品一区二区尤物区| 亚洲中国最大av网站| 亚洲一区二区欧美日韩| 亚洲资源在线观看| 亚洲国产综合人成综合网站| 午夜精品福利视频网站| 日本大胆欧美人术艺术动态| 另类小说图片综合网| 久久99热狠狠色一区二区| 国产乱对白刺激视频不卡| 成人精品电影在线观看| 色中色一区二区| 欧美性三三影院| 欧美一个色资源| 久久精品视频一区二区三区| 国产精品你懂的在线欣赏| 亚洲猫色日本管| 日日夜夜一区二区| 国产一区二区免费在线| www.亚洲人| 欧美疯狂做受xxxx富婆| 久久综合久久99| 亚洲精选免费视频| 欧美aaaaaa午夜精品| 国产成都精品91一区二区三| 91久久久免费一区二区| 日韩欧美一二区| 国产精品激情偷乱一区二区∴| 亚洲综合丁香婷婷六月香| 精品亚洲aⅴ乱码一区二区三区| 国产很黄免费观看久久| 在线观看91视频| 精品1区2区在线观看| 亚洲激情自拍偷拍| 精品一区二区在线视频| 色综合色综合色综合色综合色综合| 欧美色综合久久| 久久精品人人爽人人爽| 亚洲国产精品久久人人爱| 国产一区在线观看视频| 在线一区二区三区四区五区| 精品人伦一区二区色婷婷| 亚洲视频在线一区二区| 激情欧美一区二区三区在线观看| 色综合色综合色综合色综合色综合 | 亚洲麻豆国产自偷在线| 国产最新精品免费| 欧美日韩一区精品| 国产亚洲短视频| 日本不卡视频在线观看| 99国产精品久| 久久综合九色欧美综合狠狠| 一二三四社区欧美黄| 国产电影一区二区三区| 欧美伦理影视网| 伊人婷婷欧美激情| 国产露脸91国语对白| 欧美另类高清zo欧美| 亚洲人成在线播放网站岛国| 国产在线播放一区| 91精品婷婷国产综合久久性色| 欧美激情一区二区三区四区| 美日韩一区二区| 欧美视频第二页| 亚洲乱码国产乱码精品精可以看| 国产白丝精品91爽爽久久| 日韩三级在线观看| 天天操天天综合网| 欧美午夜精品久久久| 亚洲精品久久久久久国产精华液| 国产一区二区精品在线观看| 日韩你懂的在线播放| 性做久久久久久免费观看| 91麻豆产精品久久久久久| 国产精品网站一区| 国产成人午夜精品影院观看视频 | 久久久久久久免费视频了| 日本欧美肥老太交大片| 欧美日产在线观看| 亚洲一区视频在线观看视频| 色婷婷久久99综合精品jk白丝| 国产精品久久久久久久久免费桃花 | 欧美日韩一级二级| 亚洲风情在线资源站| 欧美在线你懂得| 亚洲午夜精品17c| 在线亚洲+欧美+日本专区| 一区二区三区中文字幕| 97久久超碰精品国产| 国产精品福利一区二区| 91视频在线看| 一区二区三区在线观看动漫| 欧美在线观看一区| 亚洲一区二区影院| 欧美精品久久久久久久多人混战 | 91麻豆123| 一区二区三区四区视频精品免费| 91蜜桃免费观看视频| 一区二区三区四区不卡在线| 精品视频一区三区九区| 日韩高清电影一区| 精品国产一区二区亚洲人成毛片| 经典三级视频一区| 久久久九九九九| 不卡av免费在线观看| 亚洲特黄一级片| 欧美自拍丝袜亚洲| 日韩精品一二三四| 欧美成人乱码一区二区三区| 国产精品一区二区久久不卡| 亚洲图片另类小说| 欧美亚洲另类激情小说| 日本va欧美va瓶| 久久精品一区二区| 色呦呦国产精品| 水蜜桃久久夜色精品一区的特点 | 成人免费在线播放视频| 在线视频中文字幕一区二区| 奇米色一区二区| 欧美激情艳妇裸体舞| 欧美在线你懂得| 久久99精品国产91久久来源| 国产精品三级av在线播放| 日本高清无吗v一区| 全部av―极品视觉盛宴亚洲| 久久综合久久综合亚洲| 色综合色狠狠综合色| 日本美女一区二区三区视频| 日本一区二区三区免费乱视频| 在线观看亚洲一区| 国产主播一区二区三区| 亚洲精品写真福利| 精品少妇一区二区三区日产乱码| www.亚洲色图| 麻豆精品一区二区三区| 日韩毛片在线免费观看| 日韩欧美一区二区久久婷婷| jizzjizzjizz欧美| 日本va欧美va精品| 国产精品久久久久久久岛一牛影视| 欧美视频一区在线| 国产精品亚洲人在线观看| 亚洲一区二区三区在线看 | 婷婷综合另类小说色区| 国产日韩欧美精品综合| 欧美日韩三级视频| 成人性生交大片| 日本中文字幕不卡| 亚洲伦理在线免费看| 国产婷婷色一区二区三区在线| 欧美日韩一区不卡| 成人精品电影在线观看| 精品午夜久久福利影院| 午夜久久久影院| 亚洲免费av观看| 国产欧美1区2区3区|