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

📄 socmeswnd.cpp

📁 socket代理的C++源码,实现了代理服务器的大部分功能
💻 CPP
字号:
// DlgSocMes.cpp : 实现文件
//

#include "stdafx.h"
#include "SocMesWnd.h"

#include "Soc.h"

#include <algorithm>
using namespace std;

// CSocMesWnd

IMPLEMENT_DYNAMIC(CSocMesWnd, CWnd)
CSocMesWnd::CSocMesWnd()
{
	m_pTcpServe = NULL;
	m_pTcpClient = NULL;
	m_pUDPSocket = NULL;
	m_pUDPSocks5 = NULL;
}

CSocMesWnd::~CSocMesWnd()
{
}


BEGIN_MESSAGE_MAP(CSocMesWnd, CWnd)
	ON_MESSAGE(SOC_NETSERVE, OnTCPServe)
	ON_MESSAGE(SOC_NETCLIENT, OnTCPClient)
	ON_MESSAGE(SOC_NETUDP, OnUDPSocket)
	ON_MESSAGE(SOC_NETUDPSOCKS5, OnUDPSock5)
END_MESSAGE_MAP()



// CSocMesWnd 消息处理程序

/////////////////////////////////////////////////////////////////////////////
//
// 服务socket的网络事件
// 参数:	wParam			产生网络事件的socket
//			lParam			网络事件
//
/////////////////////////////////////////////////////////////////////////////
LRESULT CSocMesWnd::OnTCPServe( WPARAM wParam, LPARAM lParam )
{
	int nReturn;
	int nIndex;
	int nSendID;
	int nAddLen;
	int nReceiveLen;
	sockaddr_in uSocAddIn;

	SOCKET socAccept;

	SERVE_LPARAM uData;
	uData.m_pData = m_pTcpServe->m_pData;

	nAddLen = sizeof( uSocAddIn );

	if( m_pTcpServe->m_pbOpenSev )
	{
		if( wParam == m_pTcpServe->m_socServer )
		{
			switch( lParam )
			{
			case FD_ACCEPT:

				socAccept = accept( m_pTcpServe->m_socServer, (sockaddr*)&uSocAddIn, &nAddLen );
				if( socAccept != INVALID_SOCKET )
				{
					nSendID = m_pTcpServe->m_nNextID;
					m_pTcpServe->m_nNextID++;
					m_pTcpServe->m_pbSocOpen.push_back( true );
					m_pTcpServe->m_pnSocID.push_back( nSendID );
					m_pTcpServe->m_pSocData.push_back( socAccept );
					uData.m_nSucSoc = nSendID;
					if (m_pTcpServe->m_hWndMsg != NULL)
					{
						::SendMessage( m_pTcpServe->m_hWndMsg, m_pTcpServe->m_nMsg, NET_TCPSERVERACCEPT, (LPARAM)&uData );
					}
					if (m_pTcpServe->m_pFuncMes != NULL)
					{
						(*m_pTcpServe->m_pFuncMes)(NET_TCPSERVERACCEPT, (LPARAM)&uData );
					}
				}
				else
				{
					uData.m_nSucSoc = -1;
					if (m_pTcpServe->m_hWndMsg != NULL)
					{
						::SendMessage( m_pTcpServe->m_hWndMsg, 
							m_pTcpServe->m_nMsg, NET_TCPSERVERACCEPT, 
							(LPARAM)&uData );
					}
					if (m_pTcpServe->m_pFuncMes != NULL)
					{
						(*m_pTcpServe->m_pFuncMes)(NET_TCPSERVERACCEPT, 
							(LPARAM)&uData );
					}
				}

				break;
			
			case FD_CLOSE:
				break;
			case FD_READ:
				break;
			case FD_WRITE:
				break;
			case FD_OOB:
				break;

			default:
				break;
			}
			return NULL;
		}
	}

	vector<SOCKET>::iterator iteFind;
	iteFind = find( m_pTcpServe->m_pSocData.begin(), m_pTcpServe->m_pSocData.end(), (SOCKET)wParam );
	if( iteFind == m_pTcpServe->m_pSocData.end() )
	{
		return NULL;
	}
	else
	{
		nIndex = iteFind - m_pTcpServe->m_pSocData.begin();
		nSendID = m_pTcpServe->m_pnSocID[nIndex];
	}

	if( m_pTcpServe->m_pbSocOpen[nIndex] )
	{
		switch( lParam )
		{
		case FD_CLOSE:

			nReturn = closesocket( m_pTcpServe->m_pSocData[nIndex] );
			m_pTcpServe->m_pbSocOpen.erase( m_pTcpServe->m_pbSocOpen.begin() + nIndex );
			m_pTcpServe->m_pnSocID.erase( m_pTcpServe->m_pnSocID.begin() + nIndex );
			m_pTcpServe->m_pSocData.erase( m_pTcpServe->m_pSocData.begin() + nIndex );

			uData.m_nSucSoc = nSendID;
			if (m_pTcpServe->m_hWndMsg != NULL)
			{
				::SendMessage( m_pTcpServe->m_hWndMsg, m_pTcpServe->m_nMsg,
					NET_TCPSERVERCLOSE, (LPARAM)&uData );
			}
			if (m_pTcpServe->m_pFuncMes != NULL)
			{
				(*m_pTcpServe->m_pFuncMes)(NET_TCPSERVERCLOSE, (LPARAM)&uData);
			}
			break;

		case FD_READ:

			nReceiveLen = recv( m_pTcpServe->m_pSocData[nIndex], (char*)m_pTcpServe->m_pucDataBuf, m_pTcpServe->m_nBufLen, 0 );
			if( nReceiveLen < 0 )
			{
				nReceiveLen = 0;
			}
			m_pTcpServe->m_nDataLen = nReceiveLen;
			
			uData.m_nSucSoc = nSendID;
			if (m_pTcpServe->m_hWndMsg != NULL)
			{
				::SendMessage( m_pTcpServe->m_hWndMsg, m_pTcpServe->m_nMsg, 
					NET_TCPSERVERRECEIVE, (LPARAM)&uData );
			}
			if (m_pTcpServe->m_pFuncMes != NULL)
			{
				(*m_pTcpServe->m_pFuncMes)(NET_TCPSERVERRECEIVE, (LPARAM)&uData);
			}
			break;

		case FD_WRITE:

			uData.m_nSucSoc = nSendID;
			if (m_pTcpServe->m_hWndMsg != NULL)
			{
				::SendMessage( m_pTcpServe->m_hWndMsg, m_pTcpServe->m_nMsg, 
					NET_TCPSERVERSEND, (LPARAM)&uData );
			}
			if (m_pTcpServe->m_pFuncMes != NULL)
			{
				(*m_pTcpServe->m_pFuncMes)(NET_TCPSERVERSEND, (LPARAM)&uData);
			}
			break;

		case FD_OOB:
			break;
		default:
			break;
		}
		return NULL;
	}

	return NULL;
}

/////////////////////////////////////////////////////////////////////////////
//
// 客户socket的网络事件
// 参数:	wParam			产生网络事件的socket
//			lParam			网络事件
//
/////////////////////////////////////////////////////////////////////////////
LRESULT CSocMesWnd::OnTCPClient( WPARAM wParam, LPARAM lParam )
{
	int nReceiveLen;

	if( m_pTcpClient->m_bClientOpen )
	{
		if( wParam == m_pTcpClient->m_socClient )
		{
			switch( lParam )
			{
			case FD_CONNECT:

				if (m_pTcpClient->m_hWndMsg != NULL)
				{
					::SendMessage( m_pTcpClient->m_hWndMsg, m_pTcpClient->m_nMsg, 
						NET_TCPCLIENTCONNECTED, (LPARAM)m_pTcpClient->m_pData );
				}
				if (m_pTcpClient->m_pFuncMes != NULL)
				{
					(*m_pTcpClient->m_pFuncMes)(NET_TCPCLIENTCONNECTED, 
						(LPARAM)m_pTcpClient->m_pData);
				}
				break;

			case FD_CLOSE:

				if (m_pTcpClient->m_hWndMsg != NULL)
				{
					::SendMessage( m_pTcpClient->m_hWndMsg, m_pTcpClient->m_nMsg, 
						NET_TCPCLIENTCLOSE, (LPARAM)m_pTcpClient->m_pData );
				}
				if (m_pTcpClient->m_pFuncMes != NULL)
				{
					(*m_pTcpClient->m_pFuncMes)(NET_TCPCLIENTCLOSE, 
						(LPARAM)m_pTcpClient->m_pData);
				}
				break;

			case FD_READ:

				nReceiveLen = recv( m_pTcpClient->m_socClient, (char*)m_pTcpClient->m_pucDataBuf, m_pTcpClient->m_nBufLen, 0 );
				if( nReceiveLen < 0 )
				{
					nReceiveLen = 0;
				}
				m_pTcpClient->m_nDataLen = nReceiveLen;

				if (m_pTcpClient->m_hWndMsg != NULL)
				{
					::SendMessage( m_pTcpClient->m_hWndMsg, m_pTcpClient->m_nMsg, 
						NET_TCPCLIENTRECEIVE, (LPARAM)m_pTcpClient->m_pData );
				}
				if (m_pTcpClient->m_pFuncMes != NULL)
				{
					(*m_pTcpClient->m_pFuncMes)(NET_TCPCLIENTRECEIVE, 
						(LPARAM)m_pTcpClient->m_pData);
				}
				break;

			case FD_WRITE:

				if (m_pTcpClient->m_hWndMsg != NULL)
				{
					::SendMessage( m_pTcpClient->m_hWndMsg, m_pTcpClient->m_nMsg, 
						NET_TCPCLIENTSEND, (LPARAM)m_pTcpClient->m_pData );
				}
				if (m_pTcpClient->m_pFuncMes != NULL)
				{
					(*m_pTcpClient->m_pFuncMes)(NET_TCPCLIENTSEND, 
						(LPARAM)m_pTcpClient->m_pData);
				}
				break;

			case FD_OOB:
				break;

			default:

				break;
			}
		}
	}

	return NULL;
}

/////////////////////////////////////////////////////////////////////////////
//
// UDP socket的网络事件
// 参数:	wParam			产生网络事件的socket
//			lParam			网络事件
//
/////////////////////////////////////////////////////////////////////////////
LRESULT CSocMesWnd::OnUDPSocket( WPARAM wParam, LPARAM lParam )
{
	int nReceiveLen;
	int nSize;
	sockaddr_in uSocAddIn;

	nSize = sizeof(uSocAddIn);

	if( m_pUDPSocket->m_bUDPOpen )
	{
		if( wParam == m_pUDPSocket->m_socUDP )
		{
			switch( lParam )
			{
			case FD_CLOSE:

				if (m_pUDPSocket->m_hWndMsg != NULL)
				{
					::SendMessage( m_pUDPSocket->m_hWndMsg, m_pUDPSocket->m_nMsg, 
						NET_UDPCLOSE, (LPARAM)m_pUDPSocket->m_pData );
				}
				if (m_pUDPSocket->m_pFuncMes != NULL)
				{
					(*m_pUDPSocket->m_pFuncMes)(NET_UDPCLOSE, 
						(LPARAM)m_pUDPSocket->m_pData);
				}
				break;

			case FD_READ:
				{
					UDP_LPARAM uParam;

					nReceiveLen = recvfrom( m_pUDPSocket->m_socUDP, (char*)m_pUDPSocket->m_pucDataBuf, m_pUDPSocket->m_nBufLen, 0,
						(sockaddr*)&uSocAddIn, &nSize );

					uParam.m_uInfo.pucIP[0] = uSocAddIn.sin_addr.S_un.S_un_b.s_b1;
					uParam.m_uInfo.pucIP[1] = uSocAddIn.sin_addr.S_un.S_un_b.s_b2;
					uParam.m_uInfo.pucIP[2] = uSocAddIn.sin_addr.S_un.S_un_b.s_b3;
					uParam.m_uInfo.pucIP[3] = uSocAddIn.sin_addr.S_un.S_un_b.s_b4;
					uParam.m_uInfo.nPort = ntohs(uSocAddIn.sin_port);
					uParam.m_pData = m_pUDPSocket->m_pData;

					if( nReceiveLen < 0 )
					{
						nReceiveLen = 0;
					}
					m_pUDPSocket->m_nDataLen = nReceiveLen;

					if (m_pUDPSocket->m_hWndMsg != NULL)
					{
						::SendMessage( m_pUDPSocket->m_hWndMsg, m_pUDPSocket->m_nMsg, 
							NET_UDPRECEIVE, (LPARAM)&uParam );
					}
					if (m_pUDPSocket->m_pFuncMes != NULL)
					{
						(*m_pUDPSocket->m_pFuncMes)(NET_UDPRECEIVE, 
							(LPARAM)&uParam);
					}
				}

				break;

			case FD_WRITE:

				if (m_pUDPSocket->m_hWndMsg != NULL)
				{
					::SendMessage( m_pUDPSocket->m_hWndMsg, m_pUDPSocket->m_nMsg, 
						NET_UDPSEND, (LPARAM)m_pUDPSocket->m_pData );
				}
				if (m_pUDPSocket->m_pFuncMes != NULL)
				{
					(*m_pUDPSocket->m_pFuncMes)(NET_UDPSEND, 
						(LPARAM)m_pUDPSocket->m_pData);
				}
				break;

			case FD_OOB:

				break;

			default:

				break;
			}
		}
	}

	return NULL;
}

/////////////////////////////////////////////////////////////////////////////
//
// socks5 (UDP)的网络事件
// 参数:	wParam			产生网络事件的socket
//			lParam			网络事件
//
/////////////////////////////////////////////////////////////////////////////
LRESULT CSocMesWnd::OnUDPSock5( WPARAM wParam, LPARAM lParam )
{
	int nReceiveLen;
	int nSize;

	BYTE *pucRecBuf;

	sockaddr_in uSocAddIn;

	nSize = sizeof(uSocAddIn);

	if( m_pUDPSocks5->m_bOpen )
	{
		if( wParam == m_pUDPSocks5->m_socUDPData )
		{
			switch( lParam )
			{
			case FD_CLOSE:

				if (m_pUDPSocks5->m_hWndMsg != NULL)
				{
					::SendMessage( m_pUDPSocks5->m_hWndMsg, m_pUDPSocks5->m_nMsg, 
						NET_UDPSOCKS5CLOSE, (LPARAM)m_pUDPSocks5->m_pData );
				}
				if (m_pUDPSocks5->m_pFuncMes != NULL)
				{
					(*m_pUDPSocks5->m_pFuncMes)(NET_UDPSOCKS5CLOSE, 
						(LPARAM)m_pUDPSocks5->m_pData);
				}
				break;

			case FD_READ:

				{
					UDP_LPARAM uParam;

					pucRecBuf = new BYTE[m_pUDPSocks5->m_nBufLen + 10];
					nReceiveLen = recvfrom( m_pUDPSocks5->m_socUDPData, (char*)pucRecBuf, m_pUDPSocks5->m_nBufLen + 10, 0,
						(sockaddr*)&uSocAddIn, &nSize );

					if( nReceiveLen <= 10 )
					{
						nReceiveLen = 0;
					}
					else
					{
						uParam.m_uInfo.pucIP[0] = pucRecBuf[4];
						uParam.m_uInfo.pucIP[1] = pucRecBuf[5];
						uParam.m_uInfo.pucIP[2] = pucRecBuf[6];
						uParam.m_uInfo.pucIP[3] = pucRecBuf[7];
						uParam.m_uInfo.nPort = pucRecBuf[8] * 256 + pucRecBuf[9];
						uParam.m_pData = m_pUDPSocks5->m_pData;

						memcpy( m_pUDPSocks5->m_pucDataBuf, &pucRecBuf[10], nReceiveLen - 10 );
					}

					m_pUDPSocks5->m_nDataLen = nReceiveLen - 10;
					if (m_pUDPSocks5->m_hWndMsg != NULL)
					{
						::SendMessage( m_pUDPSocks5->m_hWndMsg, m_pUDPSocks5->m_nMsg, 
							NET_UDPSOCKS5RECEIVE, (LPARAM)&uParam );
					}
					if (m_pUDPSocks5->m_pFuncMes != NULL)
					{
						(*m_pUDPSocks5->m_pFuncMes)(NET_UDPSOCKS5RECEIVE, 
							(LPARAM)&uParam);
					}

					delete [] pucRecBuf;
				}

				break;

			case FD_WRITE:

				if (m_pUDPSocks5->m_hWndMsg != NULL)
				{
					::SendMessage( m_pUDPSocks5->m_hWndMsg, m_pUDPSocks5->m_nMsg, 
						NET_UDPSOCKS5SEND, (LPARAM)m_pUDPSocks5->m_pData );
				}
				if (m_pUDPSocks5->m_pFuncMes != NULL)
				{
					(*m_pUDPSocks5->m_pFuncMes)(NET_UDPSOCKS5SEND, 
						(LPARAM)m_pUDPSocks5->m_pData);
				}
				break;

			case FD_OOB:
				break;

			default:

				break;
			}
		}
	}

	return NULL;
}

⌨️ 快捷键说明

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