下载本文示例代码
天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月5元 手机: 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费) 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。许多文章都曾经介绍过用VC 进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC 的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现Socket编程,是非常方便的。 客户端 创建一个Dialog Based项目:CSockClient。设计一对话框,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。
Control ID Type Member IDC_EDITMSG CEdit m_MSG IDC_LISTMSG ClistBox m_MSGS 在MySock.ccp中添加以下代码:
#include "CSockClient.h" #include "CSockClientDlg.h" 在MySock.h中添加以下代码:
public:BOOL m_bConnected;UINT m_nLength;char m_szBuffer[4096]; 在MySock.ccp中重载各函数
MySock::MySock(){ m_nLength=0;memset(m_szBuffer,0,sizeof(m_szBuffer));m_bConnected=FALSE;} MySock::~MySock(){ //关闭套接字if(m_hSocket!=INVALID_SOCKET)Close(); } void MySock::OnReceive(int nErrorCode) { m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);//下面两行代码用来获取对话框指针CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd;pDlg- >m_MSGS.InsertString(0,m_szBuffer);memset(m_szBuffer,0,sizeof(m_szBuffer));CAsyncSocket::OnReceive(nErrorCode);} void MySock::OnSend(int nErrorCode) { Send(m_szBuffer,m_nLength,0);m_nLength=0;memset(m_szBuffer,0,sizeof(m_szBuffer));//继续提请一个“读”的网络事件,接收Server消息AsyncSelect(FD_READ);CAsyncSocket::OnSend(nErrorCode);} void MySock::OnConnect(int nErrorCode) { if (nErrorCode==0){ m_bConnected=TRUE;CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd;memcpy(m_szBuffer,"Connected to ",13);strncat(m_szBuffer,pDlg- >m_szServerAdr,sizeof(pDlg- >m_szServerAdr));pDlg- >m_MSGS.InsertString(0,m_szBuffer);AsyncSelect(FD_READ);}//提请一个“读”的网络事件,准备接收CAsyncSocket::OnConnect(nErrorCode); } 建一对话框IDD_Addr,用来输入IP地址和Port;增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。
Control ID Type MemberIDC_Addr CString m_AddrIDC_Port Int m_Port 在CSockClientDlg.ccp中添加代码:
#include "AddrDlg.h"protected:int TryCount;MySock m_clientSocket;UINT m_szPort;public:char m_szServerAdr[256]; 双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:
m_clientSocket.ShutDown(2);m_clientSocket.m_hSocket=INVALID_SOCKET;m_clientSocket.m_bConnected=FALSE;CAddrDlg m_Dlg; m_Dlg.m_Port=1088;//默认端口1088if (m_Dlg.DoModal()==IDOK && !m_Dlg.m_Addr.IsEmpty()){ memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr));m_szPort=m_Dlg.m_Port;SetTimer(1,1000,NULL);//建立计时器,每1秒尝试连接一次TryCount=0;} 添加Windows消息WM_TIMER响应函数OnTimer
void CCSockClientDlg::OnTimer(UINT nIDEvent) { if (m_clientSocket.m_hSocket==INVALID_SOCKET){ BOOL bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);if(!bFlag){ AfxMessageBox("Socket Error!");m_clientSocket.Close();PostQuitMessage(0);return;}}m_clientSocket.Connect(m_szServerAdr,m_szPort);TryCount ;if (TryCount >=10 || m_clientSocket.m_bConnected){ KillTimer(1);if (TryCount >=10)AfxMessageBox("Connect Failed!");return;}CDialog::OnTimer(nIDEvent);} 双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码:
void CCSockClientDlg::OnSend() {if (m_clientSocket.m_bConnected){ m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer, sizeof(m_clientSocket.m_szBuffer));m_clientSocket.AsyncSelect(FD_WRITE);m_MSG.SetWindowText("");}}双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:void CCSockClientDlg::OnExit() { m_clientSocket.ShutDown(2); //关闭SocketEndDialog(0);} 运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。 服务端 Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:
CNewSocket::OnReceive(int nErrorCOde){ m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0); AsyncSelect(FD_WRITE);}// 直接转发消息CNewSocket::OnSend(int nErrorCode){ Send(m_szBuffer,m_nLength,0);} 建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下: 在MyServerSocket.h中声明变量
public::CNewSocket* m_pSocket;void CMyServerSocket::OnAccept(int nErrorCode){ CNewSocket* pSocket = new CNewSocket();if (Accept(*pSocket)){ pSocket- >AsyncSelect(FD_READ);m_pSocket=pSocket;}elsedelete pSocket;} 为对话框添加一个“侦听”按钮,添加如下代码: 在CsockServerDlg.ccp中声明变量
public:CMyServerSocket m_srvrSocket;void CCSockServerDlg::OnListen(){ if (m_srvrSocket.m_hSocket==INVALID_SOCKET){ BOOL bFlag=m_srvrSocket.Create(UserPort,SOCK_STREAM,FD_ACCEPT);if (!bFlag){ AfxMessageBox(“Socket Error!”);M_srvrSocket.Close();PostQuitMessage(0);Return;}} if (!m_srvrSocket。Listen(1)){ int nErrorCode = m_srvrSocket.GetLastError();if (nError!=WSAEWOULDBLOCK){ AfxMessageBox(“Socket Error!”);M_srvrSocket.Close();PostQuitMessage(0);Return;}}} CAsyncSocket类为我们使用Socket提供了极大方便。建立Socket的WSAStartup过程和bind过程被简化成为Create过程,IP地址类型转换、主机名和IP地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作,特别是CAsyncSocket类的异步特点,完全可以替代繁琐的线程操作。MFC提供了大量的类库,我们若能灵活的使用他们,便会大大提高编程的效率。
天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月5元 手机: 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费) 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。许多文章都曾经介绍过用VC 进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC 的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现Socket编程,是非常方便的。 客户端 创建一个Dialog Based项目:CSockClient。设计一对话框,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。
Control ID Type Member IDC_EDITMSG CEdit m_MSG IDC_LISTMSG ClistBox m_MSGS 在MySock.ccp中添加以下代码:
#include "CSockClient.h" #include "CSockClientDlg.h" 在MySock.h中添加以下代码:
public:BOOL m_bConnected;UINT m_nLength;char m_szBuffer[4096]; 在MySock.ccp中重载各函数
MySock::MySock(){ m_nLength=0;memset(m_szBuffer,0,sizeof(m_szBuffer));m_bConnected=FALSE;} MySock::~MySock(){ //关闭套接字if(m_hSocket!=INVALID_SOCKET)Close(); } void MySock::OnReceive(int nErrorCode) { m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);//下面两行代码用来获取对话框指针CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd;pDlg- >m_MSGS.InsertString(0,m_szBuffer);memset(m_szBuffer,0,sizeof(m_szBuffer));CAsyncSocket::OnReceive(nErrorCode);} void MySock::OnSend(int nErrorCode) { Send(m_szBuffer,m_nLength,0);m_nLength=0;memset(m_szBuffer,0,sizeof(m_szBuffer));//继续提请一个“读”的网络事件,接收Server消息AsyncSelect(FD_READ);CAsyncSocket::OnSend(nErrorCode);} void MySock::OnConnect(int nErrorCode) { if (nErrorCode==0){ m_bConnected=TRUE;CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd;memcpy(m_szBuffer,"Connected to ",13);strncat(m_szBuffer,pDlg- >m_szServerAdr,sizeof(pDlg- >m_szServerAdr));pDlg- >m_MSGS.InsertString(0,m_szBuffer);AsyncSelect(FD_READ);}//提请一个“读”的网络事件,准备接收CAsyncSocket::OnConnect(nErrorCode); } 建一对话框IDD_Addr,用来输入IP地址和Port;增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。
Control ID Type MemberIDC_Addr CString m_AddrIDC_Port Int m_Port 在CSockClientDlg.ccp中添加代码:
#include "AddrDlg.h"protected:int TryCount;MySock m_clientSocket;UINT m_szPort;public:char m_szServerAdr[256]; 双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:
m_clientSocket.ShutDown(2);m_clientSocket.m_hSocket=INVALID_SOCKET;m_clientSocket.m_bConnected=FALSE;CAddrDlg m_Dlg; m_Dlg.m_Port=1088;//默认端口1088if (m_Dlg.DoModal()==IDOK && !m_Dlg.m_Addr.IsEmpty()){ memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr));m_szPort=m_Dlg.m_Port;SetTimer(1,1000,NULL);//建立计时器,每1秒尝试连接一次TryCount=0;} 添加Windows消息WM_TIMER响应函数OnTimer
void CCSockClientDlg::OnTimer(UINT nIDEvent) { if (m_clientSocket.m_hSocket==INVALID_SOCKET){ BOOL bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);if(!bFlag){ AfxMessageBox("Socket Error!");m_clientSocket.Close();PostQuitMessage(0);return;}}m_clientSocket.Connect(m_szServerAdr,m_szPort);TryCount ;if (TryCount >=10 || m_clientSocket.m_bConnected){ KillTimer(1);if (TryCount >=10)AfxMessageBox("Connect Failed!");return;}CDialog::OnTimer(nIDEvent);} 双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码:
void CCSockClientDlg::OnSend() {if (m_clientSocket.m_bConnected){ m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer, sizeof(m_clientSocket.m_szBuffer));m_clientSocket.AsyncSelect(FD_WRITE);m_MSG.SetWindowText("");}}双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:void CCSockClientDlg::OnExit() { m_clientSocket.ShutDown(2); //关闭SocketEndDialog(0);} 运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。 服务端 Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:
CNewSocket::OnReceive(int nErrorCOde){ m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0); AsyncSelect(FD_WRITE);}// 直接转发消息CNewSocket::OnSend(int nErrorCode){ Send(m_szBuffer,m_nLength,0);} 建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下: 在MyServerSocket.h中声明变量
public::CNewSocket* m_pSocket;void CMyServerSocket::OnAccept(int nErrorCode){ CNewSocket* pSocket = new CNewSocket();if (Accept(*pSocket)){ pSocket- >AsyncSelect(FD_READ);m_pSocket=pSocket;}elsedelete pSocket;} 为对话框添加一个“侦听”按钮,添加如下代码: 在CsockServerDlg.ccp中声明变量
public:CMyServerSocket m_srvrSocket;void CCSockServerDlg::OnListen(){ if (m_srvrSocket.m_hSocket==INVALID_SOCKET){ BOOL bFlag=m_srvrSocket.Create(UserPort,SOCK_STREAM,FD_ACCEPT);if (!bFlag){ AfxMessageBox(“Socket Error!”);M_srvrSocket.Close();PostQuitMessage(0);Return;}} if (!m_srvrSocket。Listen(1)){ int nErrorCode = m_srvrSocket.GetLastError();if (nError!=WSAEWOULDBLOCK){ AfxMessageBox(“Socket Error!”);M_srvrSocket.Close();PostQuitMessage(0);Return;}}} CAsyncSocket类为我们使用Socket提供了极大方便。建立Socket的WSAStartup过程和bind过程被简化成为Create过程,IP地址类型转换、主机名和IP地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作,特别是CAsyncSocket类的异步特点,完全可以替代繁琐的线程操作。MFC提供了大量的类库,我们若能灵活的使用他们,便会大大提高编程的效率。
下载本文示例代码
VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程VC下用MFC类实现网络编程