📄 lsocket.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 + -