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

📄 nettestdlg.cpp

📁 用于检测自行开发的tcp/ip协议栈的小程序
💻 CPP
字号:
// NetTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "NetTest.h"
#include "NetTestDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CString CharToBin(CString str)
{
	CString temp="";
	if(str.GetLength()<=0)
		return temp;

	CString ttemp;
	for(int i=0;i<str.GetLength();i++)
	{
		ttemp.Format(" %02X",(BYTE)str[i]);
		temp+=ttemp;
	}

	return temp.Right(temp.GetLength()-1);
}

CString BinToChar(CString str)
{
	if(str.GetLength()<=0)
	{
		CString temp="";
		return temp;
	}
	char *ch=new char[(str.GetLength()+1)/3];
	for(int i=0;i<(str.GetLength()+1)/3;i++)
	{
		int aa=0;
		for(int j=0;j<2;j++)
		{
			aa=aa*16;
			if((str[i*3+j]>='a') && (str[i*3+j]<='f')) aa=aa+str[i*3+j]-'a'+10;
			else if((str[i*3+j]>='A') && (str[i*3+j]<='F')) aa=aa+str[i*3+j]-'A'+10;
			else if((str[i*3+j]>='0') && (str[i*3+j]<='9')) aa=aa+str[i*3+j]-'0';
		}
		ch[i]=aa;
	}
	CString ttemp(ch,(str.GetLength()+1)/3);
	return ttemp;
}

/////////////////////////////////////////////////////////////////////////////
// CNetTestDlg dialog

CNetTestDlg::CNetTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNetTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNetTestDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_pServerSocket=NULL;
	m_pClientSocket=NULL;

	m_bIsClientMode=TRUE;
	m_bIsListen=FALSE;
	m_bIsConnect=FALSE;
	m_bIsTextMode=TRUE;
}

void CNetTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNetTestDlg)
	DDX_Control(pDX, IDC_COMMBINDATA, m_CommBinData);
	DDX_Control(pDX, IDC_COMMTEXTDATA, m_CommTextData);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CNetTestDlg, CDialog)
	//{{AFX_MSG_MAP(CNetTestDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_CLIENTMODE, OnClientMode)
	ON_BN_CLICKED(IDC_SERVERMODE, OnServerMode)
	ON_BN_CLICKED(IDC_SENDTEXT, OnSendText)
	ON_BN_CLICKED(IDC_SENDBIN, OnSendBin)
	ON_BN_CLICKED(IDC_CONNECTLISTEN, OnConnectListen)
	ON_BN_CLICKED(IDC_SENDDATA, OnSendData)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_SOCKETMSG,OnSocketMsg)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNetTestDlg message handlers

BOOL CNetTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	((CIPAddressCtrl *)GetDlgItem(IDC_CONNECTIP))->SetAddress(127,0,0,1);
	SetDlgItemInt(IDC_CONNECTPORT,8376);
	SetDlgItemInt(IDC_LISTENPORT,8376);


	SetClientMode(m_bIsClientMode);
	SetConnectStation(m_bIsListen,m_bIsConnect);
	ShowMsg("初始化成功!",NULL,0);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CNetTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CNetTestDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CNetTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message==WM_KEYDOWN)
    {
        switch(pMsg->wParam)
        {
        case VK_RETURN:
		case VK_CANCEL:
			return TRUE;
        }
    }
	
	return CDialog::PreTranslateMessage(pMsg);
}

void CNetTestDlg::SetClientMode(BOOL bIsClientMode)
{
	m_bIsClientMode=bIsClientMode;

	SetWindowText(m_bIsClientMode ? "网络测试_单用户版  客户端" : "网络测试_单用户版  服务器端");

	GetDlgItem(IDC_CLIENTMODE)->EnableWindow(TRUE);
	((CButton *)GetDlgItem(IDC_CLIENTMODE))->SetCheck(bIsClientMode ? 1:0);
	GetDlgItem(IDC_CONNECTIP)->EnableWindow(bIsClientMode);
	GetDlgItem(IDC_CONNECTPORT)->EnableWindow(bIsClientMode);
	
	GetDlgItem(IDC_SERVERMODE)->EnableWindow(TRUE);
	((CButton *)GetDlgItem(IDC_SERVERMODE))->SetCheck(bIsClientMode ? 0:1);
	GetDlgItem(IDC_LISTENPORT)->EnableWindow(!bIsClientMode);

	SetDlgItemText(IDC_CONNECTLISTEN,m_bIsClientMode ? "开始连接" : "开始监听");
}

void CNetTestDlg::OnClientMode() 
{
	SetClientMode(TRUE);
}

void CNetTestDlg::OnServerMode() 
{
	SetClientMode(FALSE);
}

void CNetTestDlg::SetConnectStation(BOOL bIsListen,BOOL bIsConnect)
{
	m_bIsListen=bIsListen;
	m_bIsConnect=bIsConnect;

	if((!m_bIsListen) && (!bIsConnect))	//没有连接,也没有监听
	{
		SetClientMode(m_bIsClientMode);

		GetDlgItem(IDC_SENDTEXT)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDTEXTDATA)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDBIN)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDBINDATA)->EnableWindow(FALSE);

		SetDlgItemText(IDC_CONNECTLISTEN,m_bIsClientMode ? "开始连接" : "开始监听");
		GetDlgItem(IDC_SENDDATA)->EnableWindow(FALSE);
		GetDlgItem(IDCANCEL)->EnableWindow(TRUE);
	}
	
	if(m_bIsListen && (!bIsConnect))	//没有连接,开始监听
	{
		GetDlgItem(IDC_CLIENTMODE)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECTIP)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECTPORT)->EnableWindow(FALSE);
		GetDlgItem(IDC_SERVERMODE)->EnableWindow(FALSE);
		GetDlgItem(IDC_LISTENPORT)->EnableWindow(FALSE);

		GetDlgItem(IDC_SENDTEXT)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDTEXTDATA)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDBIN)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDBINDATA)->EnableWindow(FALSE);

		SetDlgItemText(IDC_CONNECTLISTEN,"停止监听");
		GetDlgItem(IDC_SENDDATA)->EnableWindow(FALSE);
		GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
	}

	if((!m_bIsListen) && bIsConnect)	//已经连接,没有监听
	{
		GetDlgItem(IDC_CLIENTMODE)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECTIP)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECTPORT)->EnableWindow(FALSE);
		GetDlgItem(IDC_SERVERMODE)->EnableWindow(FALSE);
		GetDlgItem(IDC_LISTENPORT)->EnableWindow(FALSE);

		SetTextMode(m_bIsTextMode);

		SetDlgItemText(IDC_CONNECTLISTEN,"断开连接");
		GetDlgItem(IDC_SENDDATA)->EnableWindow(TRUE);
		GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
	}

	if(m_bIsListen && bIsConnect)	//已经连接,同时也在监听
	{
		GetDlgItem(IDC_CLIENTMODE)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECTIP)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECTPORT)->EnableWindow(FALSE);
		GetDlgItem(IDC_SERVERMODE)->EnableWindow(FALSE);
		GetDlgItem(IDC_LISTENPORT)->EnableWindow(FALSE);

		SetTextMode(m_bIsTextMode);

		SetDlgItemText(IDC_CONNECTLISTEN,"停止监听");
		GetDlgItem(IDC_SENDDATA)->EnableWindow(TRUE);
		GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
	}
}

void CNetTestDlg::SetTextMode(BOOL bIsTextMode)
{
	m_bIsTextMode=bIsTextMode;

	GetDlgItem(IDC_SENDTEXT)->EnableWindow(TRUE);
	((CButton *)GetDlgItem(IDC_SENDTEXT))->SetCheck(m_bIsTextMode ? 1:0);
	GetDlgItem(IDC_SENDTEXTDATA)->EnableWindow(m_bIsTextMode);
	
	GetDlgItem(IDC_SENDBIN)->EnableWindow(TRUE);
	((CButton *)GetDlgItem(IDC_SENDBIN))->SetCheck(m_bIsTextMode ? 0:1);
	GetDlgItem(IDC_SENDBINDATA)->EnableWindow(!m_bIsTextMode);
}

void CNetTestDlg::OnSendText() 
{
	SetTextMode(TRUE);
}

void CNetTestDlg::OnSendBin() 
{
	SetTextMode(FALSE);
}

void CNetTestDlg::ShowMsg(CString strText, BYTE *pBuf, int nLength)
{
	CString strData;
	strData.Format("时间:%d",GetTickCount());

	CString strTextData,strBinData;

	if((pBuf!=NULL) && (nLength>0))
	{
		CString str((char *)pBuf,nLength);
		strTextData=strText+str;
		strBinData=strText+CharToBin(str);

		str.Format(" 共 %d 字节",nLength);
		strData+=str;
	}
	else
	{
		strTextData=strText;
		strBinData=strText;
	}

	m_CommTextData.AddString(strTextData);
	m_CommTextData.AddString(strData);
	m_CommTextData.AddString("");
	m_CommTextData.SetCurSel(m_CommTextData.GetCount()-1);

	m_CommBinData.AddString(strBinData);
	m_CommBinData.AddString(strData);
	m_CommBinData.AddString("");
	m_CommBinData.SetCurSel(m_CommBinData.GetCount()-1);
}

void CNetTestDlg::OnSocketMsg(WPARAM wParam, LPARAM lParam) 
{
	if(WSAGETSELECTERROR(lParam))
	{
		if(!m_bIsConnect)
		{
			if(WSAGETSELECTEVENT(lParam)==FD_CONNECT)
			{
				ShowMsg("连接服务器失败!",NULL,0);
				if(m_pClientSocket!=NULL)
				{
					delete m_pClientSocket;
					m_pClientSocket=NULL;
				}

				SetConnectStation(FALSE,FALSE);
			}
			else if(WSAGETSELECTEVENT(lParam)==FD_ACCEPT)
			{
				ShowMsg("接收用户连接失败!",NULL,0);
				SetConnectStation(TRUE,FALSE);
			}
		}

		return;
	}
	
	switch(WSAGETSELECTEVENT(lParam))
	{
	case FD_ACCEPT:
		if(m_pClientSocket!=NULL)
		{
			delete m_pClientSocket;
			m_pClientSocket=NULL;
		}

		m_pClientSocket=m_pServerSocket->Accept();
		if(m_pClientSocket==NULL)
		{
			ShowMsg("接收用户连接失败!",NULL,0);
			SetConnectStation(TRUE,FALSE);
		}
		else
		{
			CString strIP;
			u_short uPort;
			if(m_pClientSocket->GetRemoteInfo(strIP,uPort)==SOCKET_ERROR)
			{
				ShowMsg("接收用户连接失败!",NULL,0);

				delete m_pClientSocket;
				m_pClientSocket=NULL;

				SetConnectStation(TRUE,FALSE);
				return;
			}

			CString strInfo;
			strInfo.Format("接收用户连接成功! 客户IP:%s 端口:%d",strIP,uPort);
			ShowMsg(strInfo,NULL,0);

			SetConnectStation(TRUE,TRUE);
		}
		break;
	case FD_CONNECT:
		if(m_pClientSocket!=NULL)
		{
			CString strIP;
			u_short uPort;
			if(m_pClientSocket->GetRemoteInfo(strIP,uPort)==SOCKET_ERROR)
			{
				ShowMsg("连接服务器失败!",NULL,0);

				delete m_pClientSocket;
				m_pClientSocket=NULL;

				SetConnectStation(FALSE,FALSE);
				return;
			}

			CString strInfo;
			strInfo.Format("连接服务器成功! 服务器IP:%s 端口:%d",strIP,uPort);
			ShowMsg(strInfo,NULL,0);

			SetConnectStation(FALSE,TRUE);
		}
		break;
	case FD_READ:
		{
			if(m_pClientSocket==NULL)
				return;

			BYTE Buf[MAX_BUFLEN];
			int nRet=m_pClientSocket->Recv(Buf,MAX_BUFLEN);
			if(nRet<0)
			{
				ShowMsg("接收数据失败",NULL,0);
				return;
			}

			ShowMsg("接收数据:",Buf,nRet);
		}
		break;
	case FD_CLOSE:
		m_pClientSocket->Close();
		m_pClientSocket=NULL;

		if(m_bIsClientMode)
		{
			ShowMsg("断开与服务器的连接",NULL,0);
			SetConnectStation(FALSE,FALSE);
		}
		else
		{
			ShowMsg("用户退出",NULL,0);
			SetConnectStation(TRUE,FALSE);
		}
		break;
	}
}

void CNetTestDlg::OnConnectListen() 
{
	if(m_bIsClientMode)
	{
		if(!m_bIsConnect)	//还没有连接,则开始连接
		{
			CString strServerIP;
			u_short uPort;

			DWORD dwIP;
			if((((CIPAddressCtrl *)GetDlgItem(IDC_CONNECTIP))->GetAddress(dwIP)!=4) ||
				((uPort=GetDlgItemInt(IDC_CONNECTPORT))==0))
			{
				AfxMessageBox("请输入完整的服务器IP地址和端口号");
				return;
			}

			strServerIP.Format("%d.%d.%d.%d",(dwIP>>24) & 0xFF,(dwIP>>16) & 0xFF,(dwIP>>8) & 0xFF,dwIP & 0xFF);

			if(m_pClientSocket!=NULL)
				delete m_pClientSocket;

			m_pClientSocket=new CMySocket(GetSafeHwnd(),WM_SOCKETMSG);
			VERIFY(m_pClientSocket!=NULL);
				
			m_pClientSocket->Connect(strServerIP,uPort);

			CString strInfo;
			strInfo.Format("开始连接服务器 IP:%s 端口:%d",strServerIP,uPort);
			ShowMsg(strInfo,NULL,0);
		}
		else				//已经连接,则断开连接
		{
			if(m_pClientSocket!=NULL)
			{
				m_pClientSocket->Close();

				ShowMsg("断开与服务器的连接",NULL,0);

				delete m_pClientSocket;
				m_pClientSocket=NULL;

				SetConnectStation(FALSE,FALSE);
			}
		}
	}
	else
	{
		if(!m_bIsConnect)	//还没有监听,则开始监听
		{
			u_short uPort;

			if((uPort=GetDlgItemInt(IDC_LISTENPORT))==0)
			{
				AfxMessageBox("请输入监听端口号");
				return;
			}

			if(m_pServerSocket!=NULL)
				delete m_pClientSocket;

			m_pServerSocket=new CMySocket(GetSafeHwnd(),WM_SOCKETMSG);
			VERIFY(m_pServerSocket!=NULL);
				
			CString strInfo;
			if(m_pServerSocket->Listen(uPort))
			{
				strInfo.Format("开始监听 端口:%d",uPort);
				SetConnectStation(TRUE,FALSE);
			}
			else
				strInfo.Format("监听 端口:%d 失败",uPort);

			ShowMsg(strInfo,NULL,0);
		}
		else				//已经监听,则停止监听
		{
			if(m_pClientSocket!=NULL)
			{
				m_pClientSocket->Close();

				ShowMsg("断开与任何客户的连接",NULL,0);

				delete m_pClientSocket;
				m_pClientSocket=NULL;
			}
			if(m_pServerSocket!=NULL)
			{
				m_pServerSocket->Close();

				ShowMsg("停止监听",NULL,0);

				delete m_pServerSocket;
				m_pServerSocket=NULL;
			}

			SetConnectStation(FALSE,FALSE);
		}
	}
}

void CNetTestDlg::OnSendData() 
{
	CString strData;
	if(m_bIsTextMode)
	{
		GetDlgItemText(IDC_SENDTEXTDATA,strData);
	}
	else
	{
		GetDlgItemText(IDC_SENDBINDATA,strData);
		strData=BinToChar(strData);
	}

	if(strData.GetLength()<=0)
	{
		AfxMessageBox("请出入要发送的数据");
		return;
	}

	if(m_pClientSocket==NULL)
	{
		AfxMessageBox("还没有建立连接,请先建立连接");
		return;
	}

	if(m_pClientSocket->Send((BYTE *)LPCTSTR(strData),strData.GetLength())!=strData.GetLength())
	{
		AfxMessageBox("发送数据失败");
		return;
	}

	ShowMsg("发送:",(BYTE *)LPCTSTR(strData),strData.GetLength());
}

void CNetTestDlg::OnCancel() 
{
	if(m_pClientSocket!=NULL)
	{
		m_pClientSocket->Close();
		delete m_pClientSocket;
	}

	if(m_pServerSocket!=NULL)
	{
		m_pServerSocket->Close();
		delete m_pServerSocket;
	}
	
	CDialog::OnCancel();
}

⌨️ 快捷键说明

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