如何用MFC实现网络编程

如何用MFC实现网络编程,第1张

     一. 客户端 

     1. 创建一个Dialog Based项目:CSockClient。 

     2. 设计对话框 

     去掉Ok和Cancle两个按钮,增加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

     3. CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。

     由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下:以Public方式继承CAsyncSocket类,生成新类MySock;为MySock类添加虚函数OnReceive、OnConnect、OnSend。 

     4. 在MySock.ccp中添加以下代码 

     #include "CSockClient.h"

     #include "CSockClientDlg.h"

     5. 在MySock.h中添加以下代码 

     public:

     BOOL m_bConnected    //是否连接

     UINT m_nLength    //消息长度

     char m_szBuffer[4096] //消息缓冲区

     6. 在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)

     }

     7. 新建对话框IDD_Addr,用来输入IP地址和Port;生成新类CAddrDlg。增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。 

     Control ID    Type    Member

     IDC_Addr    CString    m_Addr

     IDC_Port    Int        m_Port

     8. 在CSockClientDlg.ccp中添加代码: 

     #include "AddrDlg.h"

     protected:

         int TryCount

         MySock m_clientSocket

         UINT m_szPort

     public:

         char m_szServerAdr[256]    

     9. 双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码: 

     void CCSockClientDlg::OnConnect() 

     {

         m_clientSocket.ShutDown(2)

         m_clientSocket.m_hSocket=INVALID_SOCKET

         m_clientSocket.m_bConnected=FALSE

         CAddrDlg m_Dlg

         //默认端口1088

     m_Dlg.m_Port=1088

         if (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

     //建立计时器,每1秒尝试连接一次,直到连上或TryCount>10

     SetTimer(1,1000,NULL)

     TryCount=0

         }

     }

     10. 添加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)

     }

     11. 双击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("")

         }

     }

     12. 双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码: 

     void CCSockClientDlg::OnExit() 

     {

         //关闭Socket

     m_clientSocket.ShutDown(2)

         //关闭对话框

     EndDialog(0)    

     }

     12.运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。

     二. 服务端

     Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。

     1. 建立一个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);

     }

     2. 建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下

     在MyServerSocket.h中声明变量

     public::

     CNewSocket* m_pSocket;

     void CMyServerSocket::OnAccept(int nErrorCode)

     {

         //侦听到连接请求,调用Accept函数

         CNewSocket* pSocket = new CNewSocket();

         if (Accept(*pSocket))

         {

     pSocket- >AsyncSelect(FD_READ);

     m_pSocket=pSocket;

         }

         else

     delete pSocket;

     }

     3. 为对话框添加一个“侦听”按钮,添加如下代码:

     在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();

用system(" ")命令吧,括号中间是命令,能打开下面的东东,你试试notepad是txt的程序

dxdiag---查看配置

systeminfo -----查看系统信息

msconfig---------系统配置实用程序

winver---------检查Windows版本

wmimgmt.msc----打开windows管理体系结构(WMI)

wupdmgr--------windows更新程序

wscript--------windows脚本宿主设置

write----------写字板

winmsd---------系统信息

wiaacmgr-------扫描仪和照相机向导

winchat--------XP自带局域网聊天

mem.exe--------显示内存使用情况

mspaint--------画图板

mstsc----------远程桌面连接

mplayer2-------媒体播放机

magnify--------放大镜实用程序

mmc------------打开控制台

mobsync--------同步命令

drwtsn32------ 系统医生

devmgmt.msc--- 设备管理器

dfrg.msc-------磁盘碎片整理程序

diskmgmt.msc---磁盘管理实用程序

dcomcnfg-------打开系统组件服务

ddeshare-------打开DDE共享设置

dvdplay--------DVD播放器

net stop messenger-----停止信使服务

net start messenger----开始信使服务

notepad--------打开记事本

nslookup-------网络管理的工具向导

ntbackup-------系统备份和还原

narrator-------屏幕“讲述人”

ntmsmgr.msc----移动存储管理器

ntmsoprq.msc---移动存储管理员*作请求

netstat -an----(TC)命令检查接口

syncapp--------创建一个公文包

sysedit--------系统配置编辑器

sigverif-------文件签名验证程序

sndrec32-------录音机

shrpubw--------创建共享文件夹

secpol.msc-----本地安全策略

syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码

services.msc---本地服务设置

Sndvol32-------音量控制程序

sfc.exe--------系统文件检查器

sfc /scannow---windows文件保护

tsshutdn-------60秒倒计时关机命令

tourstart------xp简介(安装完成后出现的漫游xp程序)

taskmgr--------任务管理器

eventvwr-------事件查看器

eudcedit-------造字程序

explorer-------打开资源管理器

packager-------对象包装程序

perfmon.msc----计算机性能监测程序

progman--------程序管理器

regedit.exe----注册表

rsop.msc-------组策略结果集

regedt32-------注册表编辑器

rononce -p ----15秒关机

regsvr32 /u *.dll----停止dll文件运行

regsvr32 /u zipfldr.dll------取消ZIP支持

cmd.exe--------CMD命令提示符

chkdsk.exe-----Chkdsk磁盘检查

certmgr.msc----证书管理实用程序

calc-----------启动计算器

charmap--------启动字符映射表

cliconfg-------SQL SERVER 客户端网络实用程序

Clipbrd--------剪贴板查看器

conf-----------启动netmeeting

compmgmt.msc---计算机管理

cleanmgr-------好东西整理

ciadv.msc------索引服务程序

osk------------打开屏幕键盘

odbcad32-------ODBC数据源管理器

oobe/msoobe /a----检查XP是否激活

lusrmgr.msc----本机用户和组

logoff---------注销命令

iexpress-------木马捆绑工具,系统自带

Nslookup-------IP地址侦测器

fsmgmt.msc-----共享文件夹管理器

utilman--------辅助工具管理器

gpedit.msc-----组策略

xp下运行命令大全.

$Systemroot$Documents and Settingsusername 目录下

appwiz.cpl------------添加删除程序

control userpasswords2--------用户帐户设置

cleanmgr-------垃圾整理

CMD--------------命令提示符可以当作是 Windows 的一个附件,Ping,Convert 这些不能在图形环境下 使用的功能要借助它来完成。

cmd------jview察看Java虚拟机版本。

command.com------调用的则是系统内置的 NTVDM,一个 DOS虚拟机。它完全是一个类似 Virtual PC 的 虚拟环境,和系统本身联系不大。当我们在命令提示符下运行 DOS 程序时,实际上也 是自动转移到 NTVDM虚拟机下,和 CMD 本身没什么关系。

calc-----------启动计算器

chkdsk.exe-----Chkdsk磁盘检查

compmgmt.msc---计算机管理

conf-----------启动 netmeeting

control userpasswords2-----User Account 权限设置

devmgmt.msc--- 设备管理器

diskmgmt.msc---磁盘管理实用程序

dfrg.msc-------磁盘碎片整理程序

drwtsn32------ 系统医生

dvdplay--------启动Media Player

dxdiag-----------DirectX Diagnostic Tool

gpedit.msc-------组策略编辑器

gpupdate /target:computer /force 强制刷新组策略

eventvwr.exe-----事件查看器

explorer-------打开资源管理器

logoff---------注销命令

lusrmgr.msc----本机用户和组

msinfo32---------系统信息

net start (servicename)----启动该服务

net stop (servicename)-----停止该服务

notepad--------打开记事本

nusrmgr.cpl-------同control userpasswords,打开用户帐户控制面板

Nslookup-------IP地址侦测器

oobe/msoobe /a----检查XP是否激活

perfmon.msc----计算机性能监测程序

progman--------程序管理器

route print------查看路由表

rononce -p ----15秒关机

rsop.msc-------组策略结果集

5回答者: m584880952 - 助理 二级 3-3 02:37

我来评论>>相关内容

? WINDOWS XP 运行命令详解 介绍每个命令的用法

? windows-xp运行命令

? WINDOWS XP运行命令都有什?

? 必备资料 103个Windows XP运行命令

? 103个Windows XP运行命令

更多相关问题>>

查看同主题问题:命令

其他回答共 3 条

开始→运行→输入的命令集锦

你可以

命令行下输入 help 就可以看到很多系统命令,每个命令得用法 例如 ping /? 可以获取系统帮助

gpedit.msc-------------------------组策略

sndrec32-------------------------录音机

nslookup-------------------------ip地址侦测器

explorer-------------------------打开资源管理器

logoff--------------------------注销命令

tsshutdn-------------------------60秒倒计时关机命令

lusrmgr.msc-------------------------本机用户和组

services.msc-------------------------本地服务设置

oobe/msoobe /a----------------------检查xp是否激活

notepad--------------------------打开记事本

cleanmgr-------------------------垃圾整理

net start messenger-----------------开始信使服务

compmgmt.msc-------------------------计算机管理

net stop messenger-----------------停止信使服务

conf-------------------------启动

dvdplay-------------------------dvd播放器

charmap-------------------------启动字符映射表

diskmgmt.msc-------------------------磁盘管理实用程序

calc-------------------------启动计算器

dfrg.msc-------------------------磁盘碎片整理程序

chkdsk.exe-------------------------chkdsk磁盘检查

devmgmt.msc--- ----------------------设备管理器

regsvr32 /u *.dll-------------------停止dll文件运行

drwtsn32------ -------------------系统医生

rononce -p ------------------------15秒关机

dxdiag-------------------------检查directx信息

regedt32-------------------------注册表编辑器

msconfig.exe-------------------------系统配置实用程序

rsop.msc-------------------------组策略结果集

mem.exe-------------------------显示内存使用情况

regedit.exe-------------------------注册表

winchat-------------------------xp自带局域网聊天

progman-------------------------程序管理器

winmsd-------------------------系统信息

perfmon.msc-------------------------计算机性能监测程序

winver-------------------------检查windows版本

sfc /scannow-----------------------扫描错误并复原

winver-------------------------检查windows版本

wmimgmt.msc-------------------------打开windows管理体系结构

wupdmgr-------------------------windows更新程序

w脚本---------------------------windows脚本宿主设置

write-------------------------写字板

winmsd-------------------------系统信息

wiaacmgr-------------------------扫描仪和照相机向导

winchat-------------------------xp自带局域网聊天

mem.exe-------------------------显示内存使用情况

msconfig.exe-------------------------系统配置实用程序

mplayer2-------------------------简易

mspaint-------------------------画图板

mstsc-------------------------远程桌面连接

mplayer2-------------------------媒体播放机

magnify-------------------------放大镜实用程序

mmc-------------------------打开控制台

mobsync-------------------------同步命令

dxdiag-------------------------检查directx信息

drwtsn32------------------------- 系统医生

devmgmt.msc-?----------------------设备管理器

dfrg.msc-------------------------磁盘碎片整理程序

diskmgmt.msc-------------------------磁盘管理实用程序

dcomcnfg-------------------------打开系统组件服务

ddeshare-------------------------打开dde共享设置

dvdplay-------------------------dvd播放器

net stop messenger-----------------停止信使服务

net start messenger-----------------开始信使服务

notepad-------------------------打开记事本

nslookup-------------------------网络管理的工具向导

ntbackup-------------------------系统备份和还原

narrator-------------------------屏幕“讲述人”

nyessmgr.msc-------------------------移动存储管理器

nyessoprq.msc-------------------------移动存储管理员 *** 作请求

netstat -an------------------------(tc)命令检查接口

syncapp-------------------------创建一个公文包

sysedit-------------------------系统配置编辑器

sigverif-------------------------文件签名验证程序

sndrec32-------------------------录音机

shrpubw-------------------------创建共享文件夹

secpol.msc-----====================本地安全策略

syskey---------================系统加密,一旦加密就不能解开,保护windows xp系统的双重密码

services.msc---======================本地服务设置

sndvol32-------==================音量控制程序

sfc.exe--------=================系统文件检查器

sfc /scannow---======================windows文件保护

tsshutdn-------==================60秒倒计时关机命令

tourstart------===================xp简介(安装完成后出现的漫游xp程序)

taskmgr--------=================任务管理器

eventvwr-------==================事件查看器

eudcedit-------==================造字程序

explorer-------==================打开资源管理器

packager-------==================对象包装程序

perfmon.msc----=====================计算机性能监测程序

progman--------=================程序管理器

regedit.exe----=====================注册表

rsop.msc-------==================组策略结果集

regedt32-------==================注册表编辑器

rononce -p ----====================15秒关机

regsvr32 /u *.dll----===============停止dll文件运行

regsvr32 /u zipfldr.dll------=====取消zip支持

cmd.exe--------=================cmd命令提示符

chkdsk.exe-----====================chkdsk磁盘检查

ceryesgr.msc----=====================证书管理实用程序

calc-----------==============启动计算器

charmap--------=================启动字符映射表

cliconfg-------==================sql server 客户端网络实用程序

clipbrd--------=================剪贴板查看器

conf-----------==============启动

compmgmt.msc---======================计算机管理

cleanmgr-------==================垃圾整理

ciadv.msc------===================索引服务程序

osk------------=============打开屏幕键盘

odbcad32-------==================odbc数据源管理器

oobe/msoobe /a----==================检查xp是否激活

lusrmgr.msc----=====================本机用户和组

logoff---------================注销命令

iexpress-------==================木马捆绑工具,系统自带

nslookup-------==================ip地址侦测器

fsmgmt.msc-----====================共享文件夹管理器

utilman--------=================辅助工具管理器

这个要看具体代码。

mfc程序的unicode字符集下,默认cstring等都是双字节存储,也就是wchar。很多系统类、函数的参数也是如此。

如果你cfile使用char

*进行读取,那么两种模式下不会有什么区别,如果是用tchar或者cstring就是不一样的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12096865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存