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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? te_socket.cpp

?? 用VC編寫的HTTP下載的win32程序
?? CPP
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
////////////////////////////////////////////////////////////////////////////////
//	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庫(kù)
#pragma comment(lib,"ws2_32.lib")

//錯(cuò)誤代號(hào)
static __declspec(thread) int _iThreadedErrorNo = 0;

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

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

/////////////////////////////////////////////////////////////////////////
//		Winsock2 函數(shù)
/////////////////////////////////////////////////////////////////////////
//初始化Winsock2動(dòng)態(tài)連接庫(kù)
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動(dòng)態(tài)連接庫(kù)
void TE_CleanupLibrary(void)
{
    WSACleanup();
}


//設(shè)置套接字屬性
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);
    }

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

	return (SOCKET_SUCCESS);
}

//創(chuàng)建具有重疊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);
	}

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


//關(guān)閉套接字
void TE_CloseSocket(SOCKET hSocket, BOOL bHardClose)
{
	// 不需要捕獲錯(cuò)誤
	if (!bHardClose) // 優(yōu)雅關(guān)閉 Graceful close
	{
		// 不再發(fā)送數(shù)據(jù),對(duì)于TCP套接字,在所有的數(shù)據(jù)都發(fā)送完畢之后,
		// 將發(fā)送一個(gè) FIN ,通知接收方所有數(shù)據(jù)已經(jīng)發(fā)送完畢。
		shutdown(hSocket, SD_SEND);

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

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

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


// 一次性接收數(shù)據(jù)(重疊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());
}

// 接收數(shù)據(jù)(阻塞直至收到數(shù)據(jù)為止)
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 (;;)
	{
		// 注冊(cè)FD_READ | FD_CLOSE 事件 
		// (因?yàn)榭赡茉诘却鼺D_READ事件中,對(duì)方關(guān)閉套接字,所以要關(guān)注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事件的發(fā)生
		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 ,也應(yīng)該 
		///			進(jìn)一步檢查網(wǎng)絡(luò)是否發(fā)生錯(cuò)誤
		///////////////////////////////////////////////////////////////
		WSANETWORKEVENTS NetEvent;
		if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hReadEvent,&NetEvent) == SOCKET_ERROR)
		{
			// 清除事件
			WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
			CloseHandle(hReadEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		//判斷發(fā)生了什么事件 FD_READ 或 FD_CLOSE	
		if( ( NetEvent.lNetworkEvents == FD_CLOSE ) ||
			 ( NetEvent.lNetworkEvents	== FD_READ && 
			   NetEvent.iErrorCode[FD_READ_BIT] !=0 ) )	// 發(fā)生錯(cuò)誤
		{
			// 清除事件
			WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
			CloseHandle(hReadEvent);
			TE_SetLastError(WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		////////////////////////////////////////////////////////////////
		// 清除事件
		WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
	
		// 接收數(shù)據(jù)
		if ((iRecvBytes = TE_RecvLL(hSocket, pszBuffer, iBufferSize)) >= 0)
			break;	// 跳出循環(huán)

		int iErrorCode = -iRecvBytes;

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

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

    CloseHandle(hReadEvent);
    return (iRecvBytes);
}


// 接收數(shù)據(jù)直至達(dá)到規(guī)定的長(zhǎng)度(緩沖區(qū)滿)或超時(shí)或沒有數(shù)據(jù)可讀取時(shí)
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)	//沒有數(shù)據(jù)可讀取
			return (iRtxBytes);

		iRtxBytes += iRtxCurrent;
	}

	return (iRtxBytes);
}


//一次性發(fā)送數(shù)據(jù)(重疊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());

}

// 發(fā)送數(shù)據(jù)
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 (;;)
	{
		////////////////////////////////////////////////////////////////
		// 發(fā)送數(shù)據(jù)成功
		if ((iSendBytes = TE_SendLL(hSocket, pszBuffer, iBufferSize)) >= 0)
			break;

		int iErrorCode = -iSendBytes;

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

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


		// 注冊(cè)FD_WRITE | FD_CLOSE 事件
		if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE|FD_CLOSE) == SOCKET_ERROR)
		{
			CloseHandle(hWriteEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}

		// 等待事件發(fā)生
		DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hWriteEvent, TRUE,dwTimeout, TRUE);

		if (dwWaitResult != WSA_WAIT_EVENT_0)
		{
			// 清除網(wǎng)絡(luò)事件
			WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
			CloseHandle(hWriteEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}

		////////////////////////////////////////////////////////////// 
		///	注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也應(yīng)該 
		///			進(jìn)一步檢查網(wǎng)絡(luò)是否發(fā)生錯(cuò)誤
		///////////////////////////////////////////////////////////////
		WSANETWORKEVENTS NetEvent;
		if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hWriteEvent,&NetEvent) == SOCKET_ERROR)
		{
  			// 清除網(wǎng)絡(luò)事件
			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 ) )	// 發(fā)生錯(cuò)誤
		{
			// 清除網(wǎng)絡(luò)事件
			WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
			CloseHandle(hWriteEvent);
			TE_SetLastError( WSAGetLastError() );
			return (SOCKET_ERROR);
		}
		// 清除網(wǎng)絡(luò)事件
		WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
   }

    CloseHandle(hWriteEvent);
    return (iSendBytes);
}

//發(fā)送完所有數(shù)據(jù)或超時(shí)
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);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品二十页| 欧美日韩一区二区三区视频| 欧美bbbbb| 日韩电影在线免费| 免费av成人在线| 九色|91porny| 国产精品99久久不卡二区| 国内精品写真在线观看| 国产成人精品三级麻豆| 成人免费高清在线| 色综合天天综合狠狠| 欧美精品久久久久久久多人混战| 欧美日韩五月天| 精品国产一二三| 国产欧美1区2区3区| 亚洲欧洲综合另类| 亚洲制服丝袜av| 日韩av网站免费在线| 国产精品自在在线| 91蝌蚪porny| 91精品国产日韩91久久久久久| 欧美一区二区三区在线观看| 久久女同精品一区二区| 中文字幕佐山爱一区二区免费| 亚洲成av人片一区二区三区| 久久精品av麻豆的观看方式| 成人动漫av在线| 欧美在线看片a免费观看| 日韩欧美一级二级三级久久久| 国产午夜精品久久| 亚洲va天堂va国产va久| 国内精品伊人久久久久影院对白| 91蜜桃网址入口| 日韩精品在线一区| 一区二区三区高清| 国产精品自拍在线| 7777精品伊人久久久大香线蕉完整版| 日韩欧美成人一区| 一区二区在线观看视频| 狠狠色狠狠色合久久伊人| 色婷婷久久综合| 久久夜色精品国产欧美乱极品| 亚洲免费观看高清完整版在线观看| 日本三级韩国三级欧美三级| 99热国产精品| 久久久久久久久岛国免费| 性久久久久久久| 91美女福利视频| 亚洲精品一区二区三区99| 亚洲午夜激情网站| 91免费看`日韩一区二区| 久久久99久久| 久久超碰97人人做人人爱| 欧美三级电影网站| 国产精品国产精品国产专区不蜜| 青青草国产精品97视觉盛宴| 欧美综合欧美视频| 国产精品每日更新| 国产99久久久国产精品免费看| 欧美一区二区久久久| 亚洲18影院在线观看| 欧美中文字幕一区二区三区| 亚洲图片你懂的| 成人免费精品视频| 国产精品乱码久久久久久| 国产成人精品影院| 欧美极品美女视频| 粉嫩欧美一区二区三区高清影视| 欧美精品一区二区三区久久久| 青青青爽久久午夜综合久久午夜 | 国产日产欧产精品推荐色| 日韩精品1区2区3区| 欧美在线free| 亚洲国产精品一区二区尤物区| 欧美自拍丝袜亚洲| 亚洲国产成人av网| 色香色香欲天天天影视综合网| 亚洲精品免费看| 欧美视频三区在线播放| 亚洲成a人片在线观看中文| 欧美人xxxx| 奇米影视一区二区三区小说| 日韩欧美高清dvd碟片| 国产在线不卡视频| 国产精品网站导航| 91在线观看一区二区| 亚洲综合一区二区三区| 欧美男人的天堂一二区| 老司机免费视频一区二区| 久久婷婷综合激情| 9久草视频在线视频精品| 亚洲激情图片小说视频| 欧美精品欧美精品系列| 国产毛片精品视频| 亚洲精品乱码久久久久久久久| 欧美亚洲日本国产| 日本一不卡视频| 国产亚洲欧美激情| 色爱区综合激月婷婷| 日韩vs国产vs欧美| 中文字幕国产一区| 在线亚洲高清视频| 狠狠色狠狠色综合| 亚洲一区成人在线| 久久网站最新地址| 色综合欧美在线| 青青草原综合久久大伊人精品| 精品国产伦一区二区三区免费| 丁香六月综合激情| 日本成人在线电影网| 国产肉丝袜一区二区| 欧美精品在线一区二区三区| 国产精品1区2区| 丝袜诱惑制服诱惑色一区在线观看| 欧美mv日韩mv国产网站app| 91在线精品一区二区| 韩日欧美一区二区三区| 亚洲综合激情另类小说区| 国产香蕉久久精品综合网| 欧美视频一区二区在线观看| 国产精品一区一区| 日本在线不卡视频| 亚洲永久免费视频| 国产精品高潮久久久久无| 日韩欧美一区二区久久婷婷| 在线视频国内一区二区| 成人黄色片在线观看| 狠狠色丁香久久婷婷综合_中| 亚洲高清视频的网址| 成人欧美一区二区三区| 2021国产精品久久精品| 欧美一区二区三区日韩| 欧美三级资源在线| 97久久精品人人澡人人爽| 国产高清视频一区| 国产剧情av麻豆香蕉精品| 老司机一区二区| 免费观看91视频大全| 亚洲一区二区三区中文字幕| 日韩伦理av电影| 国产精品免费看片| 中文字幕精品三区| 国产精品久久久久久久浪潮网站| 精品日韩成人av| 久久人人超碰精品| 亚洲精品一区在线观看| 日韩欧美一区在线| 精品少妇一区二区三区在线视频| 欧美一区二区二区| 日韩一级二级三级| 日韩精品一区二区在线观看| 欧美男女性生活在线直播观看| 在线播放日韩导航| 欧美日韩国产片| 欧美一区二区三区视频免费 | 亚洲va欧美va人人爽| 亚洲一区av在线| 丝袜亚洲另类丝袜在线| 日韩精品色哟哟| 韩国成人福利片在线播放| 国产另类ts人妖一区二区| 国产成人免费在线观看不卡| 国产一区二区三区在线观看免费| 国产又黄又大久久| 成人国产精品免费观看动漫| 99久久精品99国产精品| 色哟哟一区二区| 91精品国产综合久久精品麻豆| 日韩欧美国产麻豆| 国产精品伦一区二区三级视频| 亚洲欧美日韩综合aⅴ视频| 亚洲国产日韩综合久久精品| 五月综合激情婷婷六月色窝| 国内外成人在线| 91网站黄www| 欧美一区二区视频在线观看2022| 久久蜜臀精品av| 亚洲伦理在线免费看| 天天av天天翘天天综合网| 国内精品久久久久影院一蜜桃| 成人激情黄色小说| 欧美日韩高清一区二区| 久久久午夜电影| 亚洲一级二级在线| 国产一区二区三区免费播放| 91传媒视频在线播放| 精品国产99国产精品| 亚洲精品久久久久久国产精华液| 奇米888四色在线精品| 国产91精品露脸国语对白| 欧美三级电影网站| 中文字幕中文字幕一区二区| 日韩成人免费电影| 色综合久久综合网97色综合| 欧美电影免费观看高清完整版在 | 在线不卡的av| 日韩码欧中文字| 国产一区不卡精品| 欧美精品自拍偷拍| 亚洲视频一二区|