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

📄 lsocket.cpp

📁 隐藏进程代码
💻 CPP
字号:
// LSocket.cpp: implementation of the CLSocket class.
//
//////////////////////////////////////////////////////////////////////

#include "LSocket.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "stdio.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void Display(char*  szData,long lMsgType,...)
{
	printf(szData);
}

CLSocket::CLSocket()
{
	m_hSocket=INVALID_SOCKET;
	InitSocketSystemOnce();
	m_hEvent[0]=WSA_INVALID_EVENT;
	memset(m_szError,0,200);
	memset(m_szProxyIP,0,20);
}

CLSocket::~CLSocket()
{
	Close();
}

BOOL CLSocket::Create(UINT nSocketPort, int nSocketType,long lEvent,LPCTSTR lpszSocketAddress)
{
	m_lEvent=lEvent;
	if(m_hSocket!=INVALID_SOCKET)
	{
		Close();
	}
	m_hSocket=socket(AF_INET,nSocketType,IPPROTO_TCP);
	//建立socket
	if (m_hSocket==SOCKET_ERROR)
	{
		Display("Socket Creat Error:%s\n",1,TranslateSocketError());
		m_hSocket=INVALID_SOCKET;
		return FALSE;
	}
	if(!Bind(nSocketPort,lpszSocketAddress))
	{
		Display("Socket Bind Error:%s\n",1,TranslateSocketError());
		Close();
		m_hSocket=INVALID_SOCKET;
		return FALSE;
	}
	return TRUE;
}

void CLSocket::operator=(const CLSocket& rSrc)
{
	m_hSocket=rSrc.m_hSocket;
	m_lEvent=rSrc.m_lEvent;
	Select();
}

void CLSocket::Close()
{
	if(	m_hEvent[0]!=WSA_INVALID_EVENT)
	{
		WSACloseEvent(m_hEvent[0]);
		m_hEvent[0]=WSA_INVALID_EVENT;
	}	
	if (m_hSocket != INVALID_SOCKET)
	{
		closesocket(m_hSocket);
		m_hSocket=INVALID_SOCKET;
	}
}

int CLSocket::Receive(void* lpBuf, int nBufLen, int nFlags)
{
	return recv(m_hSocket,(char*)lpBuf,nBufLen,nFlags);
}

int CLSocket::Send(const void* lpBuf, int nBufLen, int nFlags)
{
	return send(m_hSocket,(char*)lpBuf,nBufLen,nFlags);
}

BOOL CLSocket::Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress)
{
	SOCKADDR_IN sockAddr;
	memset(&sockAddr,0,sizeof(sockAddr));
	LPSTR lpszAscii =(LPSTR)lpszSocketAddress;
	sockAddr.sin_family = AF_INET;
	if (lpszAscii == NULL)
		sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	else
	{
		DWORD lResult = inet_addr(lpszAscii);
		if (lResult == INADDR_NONE)
		{
			WSASetLastError(WSAEINVAL);
			return FALSE;
		}
		sockAddr.sin_addr.s_addr = lResult;
	}
	sockAddr.sin_port = htons((u_short)nSocketPort);
	return (SOCKET_ERROR != bind(m_hSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)));
}

BOOL CLSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
{
	SOCKADDR_IN sockAddr;
	memset(&sockAddr,0,sizeof(sockAddr));
	LPSTR lpszAscii = (LPSTR)lpszHostAddress;
	sockAddr.sin_family = AF_INET;
	sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);
	if (sockAddr.sin_addr.s_addr == INADDR_NONE)
	{
		LPHOSTENT lphost;
		lphost = gethostbyname(lpszAscii);
		if (lphost != NULL)
			sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
		else
		{
			WSASetLastError(WSAEINVAL);
			return FALSE;
		}
	}
	sockAddr.sin_port = htons((u_short)nHostPort);
	if(connect(m_hSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) != SOCKET_ERROR)
	{
		Select();
		return TRUE;
	}
	Display(TranslateSocketError(),1);
	Close();
	return FALSE;
}

BOOL CLSocket::Listen(int nConnectionBacklog)
{
	Select();
	return (SOCKET_ERROR != listen(m_hSocket, nConnectionBacklog)); 
}

BOOL CLSocket::Accept(CLSocket& rConnectedSocket,SOCKADDR* lpSockAddr, int* lpSockAddrLen)
{
	rConnectedSocket.Close();
	SOCKET hTemp = accept(m_hSocket, lpSockAddr, lpSockAddrLen);
	if (hTemp == INVALID_SOCKET)
	{
		rConnectedSocket.m_hSocket = INVALID_SOCKET;
		return FALSE;
	}
	rConnectedSocket.m_hSocket = hTemp;
	rConnectedSocket.m_lEvent=m_lEvent;
	rConnectedSocket.Select();
	return true;
}


void CLSocket::InitSocketSystemOnce()
{
	WSADATA wsd;
	if (WSAStartup(MAKEWORD(2,2),&wsd)!=0)
	{//WinSocket 版本2初始化
		//printf("Failed to load Winsock!\n");
		return ;
	}
	return ;
}

char*  CLSocket::TranslateSocketError(long lErrNO)
{
	if(lErrNO==-1)
		lErrNO=WSAGetLastError();
    switch(lErrNO)
		{
		case WSANOTINITIALISED :
				//Test="Socket 没有初始化!";
				break;
		case WSAENETDOWN:
				//Test="网络系统发生错误!";
				break;
		case WSAEFAULT:
				//Test="lpSockAddrLen的长度太小!";
				break;
		case WSAEINPROGRESS:
				//Test="发生堵塞!";
				break;
		case WSAEMFILE:
				//Test="接受队列空!";
				break;
		case WSAENOBUFS:
				//Test="缓冲区没有空间!";
				break;
		case WSAENOTSOCK:
				//Test="不是一个Socket!";
				break;
		case WSAEOPNOTSUPP:
				//Test="socket类型错!";
				break;
		case WSAEWOULDBLOCK:
				//Test="Socket标记为非堵塞,请求操作发生堵塞。";
				break;
		case WSAEADDRINUSE:
				//Test="指定地址正在使用!";
				break;
        case WSAEADDRNOTAVAIL:
				//Test="本机地址不可用!";
				break;
		case WSAECONNREFUSED:
				//Test="连接被拒绝!";
				break;
		case WSAEDESTADDRREQ:
				//Test="未提供目标地址!";
				break;
		case WSAENETUNREACH:
				//Test="主机连不上网!";
				break;
        case WSAETIMEDOUT:
				//Test="连接超时!";
				break;
		case WSAECONNABORTED:
				//Test="连接被服务器强制中断或网络中断!";
				break;
		default:
			    //Test.Format("socket错误,请参阅winsock.h,:%d",lErrNO);;
			;
		}
	return m_szError;
}

//#define display_run
BOOL CLSocket::Run(long lTimeout)
{
	if(m_hSocket==INVALID_SOCKET)
		return FALSE;
	DWORD m_Flag=WSAWaitForMultipleEvents(1,m_hEvent,false,lTimeout,false);
	switch(m_Flag)
	{
	case WSA_WAIT_EVENT_0:
		{
			WSANETWORKEVENTS we;
			int iRet=WSAEnumNetworkEvents(m_hSocket,m_hEvent[0],&we);
			if(we.lNetworkEvents&FD_READ)
			{
#ifdef display_run
				printf("FD_READ\n");
#endif
				OnReceive(NULL);
				return TRUE;
			}
			if(we.lNetworkEvents&FD_ACCEPT)
			{
#ifdef display_run
				printf("accept\n");
#endif
				OnAccept(NULL);
				return TRUE;
			}
			if(we.lNetworkEvents&FD_CLOSE)
			{
#ifdef display_run
				Display("Event be Closed\n",0);
#endif
				Close();
				OnClose(NULL);
				return TRUE;
			}
			if(we.lNetworkEvents&FD_CONNECT)
			{
#ifdef display_run
				printf("connect\n");
#endif
				OnConnect(NULL);
			}
			if(we.lNetworkEvents&FD_OOB)
			{
				//printf("accept\n");
				OnOutOfBandData(NULL);
			}
			if(we.lNetworkEvents&FD_WRITE)
			{
				//printf("accept\n");
				OnSend(NULL);
			}
		}//end case wsa_wait_event_0
		 break;
	case	WSA_WAIT_TIMEOUT: //do timeout
#ifdef display_run
			//Display("timeout\n",0);
#endif
			return TRUE;
			break;
	case	WAIT_IO_COMPLETION://  One or more I/O completion routines are queued for execution.
	case	WSANOTINITIALISED:// A successful WSAStartup call must occur before using this function. 
	case	WSAENETDOWN:// The network subsystem has failed. 
	case	WSAEINPROGRESS:// A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function. 
	case	WSA_NOT_ENOUGH_MEMORY: //Not enough free memory available to complete the operation. 
	case	WSA_INVALID_HANDLE: //One or more of the values in the lphEvents array is not a valid event object handle. 
	case	WSA_INVALID_PARAMETER:// The cEvents parameter does not contain a valid handle count. 
	default:
		Display("UnKnow sate!!\n",1);
		return FALSE;
	}//end switchs
	return FALSE;
}

void CLSocket::OnReceive(int nErrorCode)
{

}

void CLSocket::OnSend(int nErrorCode)
{

}

void CLSocket::OnOutOfBandData(int nErrorCode)
{

}

void CLSocket::OnAccept(int nErrorCode)
{

}

void CLSocket::OnConnect(int nErrorCode)
{

}

void CLSocket::OnClose(int nErrorCode)
{
	
}

BOOL CLSocket::Select()
{
	if(	m_hEvent[0]!=WSA_INVALID_EVENT)
	{
		WSACloseEvent(m_hEvent[0]);
		m_hEvent[0]=WSA_INVALID_EVENT;
	}	
	if((m_hEvent[0]=WSACreateEvent())==WSA_INVALID_EVENT)
	{
		Display("WSACreateEvent error!!\n",1);
	}
	if(WSAEventSelect(m_hSocket,m_hEvent[0],m_lEvent)!=SOCKET_ERROR)
		return TRUE;
	Display("Event Select Error,errno[%d]!\n",1,WSAGetLastError ());
	Close();
	return FALSE;
}

void CLSocket::SetProxy(const char* szIP, long lPort)
{
	m_lProxyPort=lPort;
	strcpy(m_szProxyIP,szIP);
	//sprintf( buff, "%s%s:%d%s","CONNECT ",GetServerHostName(),GetPort()," HTTP/1.1\r\nUser-Agent: MyApp/0.1\r\n\r\n");
	//CONNECT www.sina.com.cn:80 http/1.1
}

BOOL CLSocket::ConnectWithProxy(LPCTSTR lpszHostAddress, UINT nHostPort, LPCTSTR lpszProxyAddress, UINT nProxyPort)
{
	SetProxy(lpszProxyAddress,nProxyPort);
	if(!Connect(lpszProxyAddress,nProxyPort))
		return FALSE;
	char szSend[200];
	sprintf(szSend,"CONNECT %s:%d HTTP/1.1\r\nUser-Agent: BigcatApp/0.1\r\n\r\n",lpszHostAddress,nHostPort);
	if(!Send(szSend,strlen(szSend)))
	{
		Close();
		return FALSE;
	}
	char szRet[]="HTTP/1.0 200 Connection established\r\n\r\n";
	if(!Receive(szRet,strlen(szRet)))
	{
		Close();
		return FALSE;
	}
	if(strcmp(szRet,"HTTP/1.0 200 Connection established\r\n\r\n")!=0)
	{
		Close();
		return FALSE;
	}
	return TRUE;
}

⌨️ 快捷键说明

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