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