书签 分享 收藏 举报 版权申诉 / 200
上传文档赚钱

类型《TCP IP协议与网络编程》课件第10章 网络程序设计实例.ppt

  • 上传人(卖家):momomo
  • 文档编号:7862584
  • 上传时间:2024-08-28
  • 格式:PPT
  • 页数:200
  • 大小:529KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《TCP IP协议与网络编程》课件第10章 网络程序设计实例.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    TCP IP协议与网络编程 TCP IP协议与网络编程课件第10章 网络程序设计实例 TCP IP 协议 网络 编程 课件 10 网络程序设计 实例
    资源描述:

    1、第第10章章 网络程序设计实例网络程序设计实例 第第10章章 网络程序设计实例网络程序设计实例 10.1 使用使用Winsock API设计网络程序的实例设计网络程序的实例10.2 使用使用MFC类库进行网络程序设计的实例类库进行网络程序设计的实例 10.3 基于基于WinInet API的客户程序编写实例的客户程序编写实例10.4 原始套接口原始套接口(SOCK_RAW)程序设计实例程序设计实例10.5 广播通信与组播通信程序设计实例广播通信与组播通信程序设计实例习题习题 第第10章章 网络程序设计实例网络程序设计实例 10.1 使用Winsock API设计网络程序的实例10.1.1 程序

    2、源代码1UDP程序1的源代码/编程环境:VC 6.0/程序说明:基于用户数据报协议UDP的程序实例/程序功能:在窗口中点击鼠标左键,则发送信息到端口号为6000的远程机上,并可以从端/口号6000的远程机接收数据第第10章章 网络程序设计实例网络程序设计实例#include stdafx.h#include/说明全局量HINSTANCE hInst;LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/i n t A P I E N T RY Wi n M a i n(H I N S TA N C E hI,HINSTANCE hP,LPSTR l

    3、p,int nC)第第10章章 网络程序设计实例网络程序设计实例 MSG msg;HWND hWnd;/实例句柄存入全局量hInsthInst=hI;WNDCLASS wc;memset(&wc,0,sizeof(WNDCLASS);wc.lpfnWndProc=(WNDPROC)WndProc;wc.hInstance=hI;wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);第第10章章 网络程序设计实例网络程序设计实例 w c.h b r B a c k g r o u n d=(HBRUSH)COLOR_WINDOW;wc.lpszClassName=W1;

    4、RegisterClass(&wc);hWnd=CreateWindowEx(WS_EX_PALETTEWINDOW,W1,UDP程序1端口:8000,WS_OVERLAPPEDWINDOW,100,100,200,100,NULL,NULL,hI,NULL);第第10章章 网络程序设计实例网络程序设计实例 if(!hWnd)return FALSE;ShowWindow(hWnd,nC);/主消息循环while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);第第10章章 网络程序设计实例网络程序设计

    5、实例 return msg.wParam;/定义Winsock API需要的量WSADATA ws;SOCKET s1,s2;struct sockaddr_in Cs1A,Cs2A;/发送数据缓冲char sendBuf200;/接收数据缓冲第第10章章 网络程序设计实例网络程序设计实例 char recvBuf200;int len;/存放接收到的字节数#define Cs1Port 8000/本地端口号#define Cs2Port 6000/远程端口号#define Cs1IP 127.0.0.1/本地IP地址#define Cs2IP 127.0.0.1/远程IP地址/消息处理LRE

    6、SULT CALLBACK WndProc(HWND hW,UINT msg,WPARAM wP,LPARAM lP)第第10章章 网络程序设计实例网络程序设计实例 switch(msg)case WM_DESTROY:/关闭程序触发事件/向Windows注销Socket触发事件WSAAsyncSelect(s1,hW,0,0);/释放连接closesocket(s1);/卸载动态链接库Winsock DLLWSACleanup();PostQuitMessage(0);第第10章章 网络程序设计实例网络程序设计实例 break;case WM_CREATE:/初始化触发事件/装载动态链接库W

    7、insock DLLWSAStartup(0 x0202,&ws);/创建UDP套接字s1=socket(AF_INET,SOCK_DGRAM,0);/设置地址类型Cs1A.sin_family=AF_INET;/本地端口Cs1A.sin_port=htons(Cs1Port);第第10章章 网络程序设计实例网络程序设计实例/本地IP地址Cs1A.sin_addr.s_addr=inet_addr(Cs1IP);/进行本地绑定len=bind(s1,(struct sockaddr*)&Cs1A,sizeof(Cs1A);/远程地址类型Cs2A.sin_family=AF_INET;/远程端口

    8、Cs2A.sin_port=htons(Cs2Port);/远程IP地址第第10章章 网络程序设计实例网络程序设计实例 Cs2A.sin_addr.s_addr=inet_addr(Cs2IP);/向Windows注册网络事件WSAAsyncSelect(s1,hW,WM_USER+1,FD_READ);Beep(2000,200);/发出报警声音break;case WM_USER+1:/Socket触发事件switch(LOWORD(lP)第第10章章 网络程序设计实例网络程序设计实例 case FD_READ:/接收远程信息len=recv(s1,recvBuf,sizeof(recvB

    9、uf),0);recvBuflen=0;MessageBox(0,recvBuf,UDP程序1从UDP程序2收到的数据,MB_OK);break;break;第第10章章 网络程序设计实例网络程序设计实例 case WM_LBUTTONDOWN:/点击鼠标左键/将发送数据放入缓冲区wsprintf(sendBuf,Hello,UDP程序2!);len=sizeof(Cs2A);/发送信息sendto(s1,sendBuf,strlen(sendBuf),0,(struct sockaddr*)&Cs2A,len);break;return DefWindowProc(hW,msg,wP,lP)

    10、;第第10章章 网络程序设计实例网络程序设计实例 2UDP程序2的源代码/编程环境:VC 6.0/程序说明:基于用户数据报协议UDP的程序实例/程序功能:在窗口里点击鼠标左键,则发送信息到端口为8000的远程机上,并可以从端口/为8000的远程机接收数据#include stdafx.h#include 第第10章章 网络程序设计实例网络程序设计实例/说明全局量HINSTANCE hInst;LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/-int APIENTRY WinMain(HINSTANCE hI,HINSTANCE hP,LPST

    11、R lp,int nC)第第10章章 网络程序设计实例网络程序设计实例 MSG msg;HWND hWnd;/实例句柄存入全局量hInst hInst=hI;WNDCLASS wc;memset(&wc,0,sizeof(WNDCLASS);wc.lpfnWndProc=(WNDPROC)WndProc;wc.hInstance=hI;第第10章章 网络程序设计实例网络程序设计实例 wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);w c.h b r B a c k g r o u n d=(HBRUSH)COLOR_WINDOW;wc.lpszClassName

    12、=W1;RegisterClass(&wc);hWnd=CreateWindowEx(WS_EX_PALETTEWINDOW,W1,UDP程序2端口:6000,WS_OVERLAPPEDWINDOW,400,200,200,100,NULL,NULL,hI,NULL);第第10章章 网络程序设计实例网络程序设计实例 if(!hWnd)return FALSE;ShowWindow(hWnd,nC);/主消息循环 while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wPara

    13、m;第第10章章 网络程序设计实例网络程序设计实例/定义Winsock API需要的量WSADATA ws;SOCKET s1,s2;struct sockaddr_in Cs1A,Cs2A;/发送数据缓冲char sendBuf200;/接收数据缓冲char recvBuf200;int len;/存放接收到的字节数第第10章章 网络程序设计实例网络程序设计实例#define Cs1Port 6000/本地端口#define Cs2Port 8000/远程端口#define Cs1IP 127.0.0.1/本地网址#define Cs2IP 127.0.0.1/远程网址/-/消息处理LRES

    14、ULT CALLBACK WndProc(HWND hW,UINT msg,WPARAM wP,LPARAM lP)第第10章章 网络程序设计实例网络程序设计实例 switch(msg)case WM_DESTROY:/关闭程序触发事件/向Windows注销Socket触发事件WSAAsyncSelect(s1,hW,0,0);/释放连接closesocket(s1);/卸载动态链接库Winsock DLL第第10章章 网络程序设计实例网络程序设计实例 WSACleanup();PostQuitMessage(0);break;case WM_CREATE:/程序初始化触发事件/装载动态链接库

    15、Winsock DLLWSAStartup(0 x0202,&ws);/创建UDP套接字s1=socket(AF_INET,SOCK_DGRAM,0);第第10章章 网络程序设计实例网络程序设计实例/设置地址类型Cs1A.sin_family=AF_INET;/本地端口Cs1A.sin_port=htons(Cs1Port);/本地IP地址Cs1A.sin_addr.s_addr=inet_addr(Cs1IP);/进行本地绑定len=bind(s1,(struct sockaddr*)&Cs1A,sizeof(Cs1A);/远程地址类型Cs2A.sin_family=AF_INET;第第10

    16、章章 网络程序设计实例网络程序设计实例/远程端口Cs2A.sin_port=htons(Cs2Port);/远程IP地址Cs2A.sin_addr.s_addr=inet_addr(Cs2IP);/向Windows注册网络事件WSAAsyncSelect(s1,hW,WM_USER+1,FD_READ);break;case WM_USER+1:/Socket触发事件 第第10章章 网络程序设计实例网络程序设计实例 switch(LOWORD(lP)case FD_READ:/接收远程信息len=recv(s1,recvBuf,sizeof(recvBuf),0);recvBuflen=0;M

    17、essageBox(0,recvBuf,UDP程序2从UDP程序1收到的数据,0);break;break;第第10章章 网络程序设计实例网络程序设计实例 case WM_LBUTTONDOWN:/点击鼠标左键wsprintf(sendBuf,Hello,UDP程序1!);len=sizeof(Cs2A);/发送信息sendto(s1,sendBuf,strlen(sendBuf),0,(struct sockaddr*)&Cs2A,len);break;return DefWindowProc(hW,msg,wP,lP);第第10章章 网络程序设计实例网络程序设计实例 10.1.2 程序运行

    18、结果在这两个程序调试、编译和链接正确后,就可以执行这两个程序了。这两个程序执行后的窗口如图10-1所示,其中,图(a)是UDP程序1执行后的窗口,图(b)是UDP程序2执行后的窗口。第第10章章 网络程序设计实例网络程序设计实例(a)UDP程序1的窗口 (b)UDP程序2的窗口 图10-1UDP程序执行后的窗口第第10章章 网络程序设计实例网络程序设计实例 程序执行后就可以检查它们所实现的功能了。在UDP程序1的窗口中点击鼠标左键,则可以发送数据给UDP程序2,UDP程序2在收到UDP程序1发送的数据后,弹出如图10-2(a)所示的窗口,并显示收到的数据。同样,如果在UDP程序2的窗口中点击鼠

    19、标左键,则可以发送数据给UDP程序1,UDP程序1在收到UDP程序2发送的数据后,弹出如图10-2(b)所示的窗口。第第10章章 网络程序设计实例网络程序设计实例(a)UDP程序2收到的信息 (b)UDP程序1收到的信息图10-2UDP程序收到数据后弹出的窗口第第10章章 网络程序设计实例网络程序设计实例 在学习这两个程序的过程中,我们应该注意两个问题:(1)在程序中,虽然使用的是数据报传输方式(SOCK_DGRAM),但却使用bind()函数进行了地址的绑定。(2)这两个程序的功能是一样的,所以代码几乎是相同的。第第10章章 网络程序设计实例网络程序设计实例 10.2 使用使用MFC类库进行

    20、网络程序类库进行网络程序设计的实例设计的实例 10.2.1 创建客户端程序我们使用VC+提供的可视化集成编程环境来创建客户端程序。创建客户端程序的主要步骤介绍如下。1创建一个工程使 用 V C+的 应 用 程 序 生 成 向 导(M F C AppWizardexe)创建一个基于对话框的工程,该工程的名称为CSockClient。2设计程序对话框如图10-3所示。第第10章章 网络程序设计实例网络程序设计实例 图10-3添加类变量 第第10章章 网络程序设计实例网络程序设计实例 3生成CAsyncSocket类的子类MySock4在MySock.ccp文件中添加文件包含信息在生成的MySock

    21、.cpp中添加如下文件包含信息:#include CSockClient.h#include CSockClientDlg.h“5向MySock.h文件中添加代码向MySock.h文件中添加如下代码:public:BOOL m_bConnected;/是否连接 UINT m_nLength;/消息长度 char m_szBuffer4096;/消息缓冲区第第10章章 网络程序设计实例网络程序设计实例 6重载MySock.ccp文件中的各函数(1)MySock()函数重载的代码如下:MySock:MySock()m_nLength=0;memset(m_szBuffer,0,sizeof(m_s

    22、zBuffer);m_bConnected=FALSEMySock:MySock()/关闭套接字if(m_hSocket!=INVALID_SOCKET)Close();第第10章章 网络程序设计实例网络程序设计实例(2)OnReceive()函数重载的代码如下:void MySock:OnReceive(int nErrorCode)m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);/下面两行代码用来获取对话框指针CCSockClientApp*pApp=(CCSockClientApp*)AfxGetApp();CCSockClientD

    23、lg*pDlg=(CCSockClientDlg*)pApp-m_pMainWnd;pDlg-m_MSGS.InsertString(0,m_szBuffer);memset(m_szBuffer,0,sizeof(m_szBuffer);CAsyncSocket:OnReceive(nErrorCode);第第10章章 网络程序设计实例网络程序设计实例(3)OnSend()函数重载的代码如下:void MySock:OnSend(int nErrorCode)Send(m_szBuffer,m_nLength,0);m_nLength=0;memset(m_szBuffer,0,sizeof

    24、(m_szBuffer);/继续提请一个读的网络事件,接收Server消息AsyncSelect(FD_READ);CAsyncSocket:OnSend(nErrorCode);第第10章章 网络程序设计实例网络程序设计实例(4)OnConnect()函数重载的代码如下:void MySock:OnConnect(int nErrorCode)if(nErrorCode=0)m_bConnected=TRUE;CCSockClientApp*pApp=(CCSockClientApp*)AfxGetApp();CCSockClientDlg*pDlg=(CCSockClientDlg*)pA

    25、pp-m_pMainWnd;第第10章章 网络程序设计实例网络程序设计实例 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);第第10章章 网络程序设计实例网络程序设计实例 7新建一个输入地址的对话框新建一个输入地址信息的对话框

    26、IDD_Addr用来输入IP地址和端口号;生成一个新的基于对话框的类CAddrDlg。在该对话框中增加两个编辑(Edit)控件:一个为IDC_Addr,用来输入要连接的IP地址;另一个为IDC_Port,用来输入端口号。使用类向导(ClassWizard)为CAddrDlg类添加m_Addr和m_Port两个类变量。它们的ID标识、类型和名称如下:Control IDTypeMemberIDC_AddrCStringm_AddrIDC_PortIntm_Port第第10章章 网络程序设计实例网络程序设计实例 然后向CSockClientDlg类中添加如下代码:protected:int Try

    27、Count;MySock m_clientSocket;UINT m_szPort;public:char m_szServerAdr256;第第10章章 网络程序设计实例网络程序设计实例 10添加“连接”按钮的程序代码双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:void CCSockClientDlg:OnConnect()m_clientSocket.ShutDown(2);m_clientSocket.m_hSocket=INVALID_SOCKET;m_clientSocket.m_bConnected=FALSE;CAddrDlg m_Dlg

    28、;/默认端口7m_Dlg.m_Port=7;i f (m _ D l g.D o M o d a l()=I D O K&!m_Dlg.m_Addr.IsEmpty()第第10章章 网络程序设计实例网络程序设计实例 memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr);m_szPort=m_Dlg.m_Port;/建立计时器,每1秒尝试连接一次,直到连上或TryCount10SetTimer(1,1000,NULL);TryCount=0;第第10章章 网络程序设计实例网络程序设计实例 11添加Windows消息WM_TIMER的响应函

    29、数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)第第10章章 网络程序设计实例网络程序设计实例 AfxMessageBox(Socket Error!);m_clientSocket.Close();PostQuitMessage(0);return;m_clientSocket.Connect(m_szServerA

    30、dr,m_szPort);TryCount+;if(TryCount=10|m_clientSocket.m_bConnected)第第10章章 网络程序设计实例网络程序设计实例 KillTimer(1);if(TryCount=10)AfxMessageBox(Connect Failed!);return;CDialog:OnTimer(nIDEvent);第第10章章 网络程序设计实例网络程序设计实例 12添加“发送”按钮的程序代码 双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码:void CCSockClientDlg:OnSend()if(m_c

    31、lientSocket.m_bConnected)m_clientSocket.m_nLength=m_MSG.GetWindowText(m _ c l i e n t S o c k e t.m _ s z B u f f e r,sizeof(m_clientSocket.m_szBuffer);m_clientSocket.AsyncSelect(FD_WRITE);m_MSG.SetWindowText();第第10章章 网络程序设计实例网络程序设计实例 13添加“关闭”按钮的程序代码 双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:void C

    32、CSockClientDlg:OnExit()/关闭Socketm_clientSocket.ShutDown(2);/关闭对话框EndDialog(0);第第10章章 网络程序设计实例网络程序设计实例 上述步骤完成后,调试程序并建立可执行的.EXE文件。当该项目运行时,弹出如图10-4所示的程序对话框。点击“Connect”按钮,弹出如图10-5所示的对话框,输入要连接的服务器的IP地址和端口号,然后单击“OK”按钮。当连接建立后,就可以在客户程序对话框中输入回送信息,并按“Send”按钮进行程序测试了。第第10章章 网络程序设计实例网络程序设计实例 图10-4客户程序对话框 第第10章章

    33、网络程序设计实例网络程序设计实例 图10-5地址信息输入对话框 第第10章章 网络程序设计实例网络程序设计实例 10.2.2 创建服务器端程序1建立一个CAsyncSocket的子类在本例中,由于我们要实现的是一个回声程序,所以服务器程序应将收到的信息原封不动地发送给客户程序。因此,服务器程序的代码主要是重载CAsyncSocket类的接收和发送函数。建立一个CAsyncSocket类的子类CNewSocket,并重载CAsyncSocket类的OnReceive()和OnSend()函数。程序代码如下:第第10章章 网络程序设计实例网络程序设计实例 CnewSocket:OnReceive(

    34、int nErrorCode)m_nLength=receive(m_szBuffer,sizeof(m_szBuffer),0);/直接转发消息AsyncSelect(FD_WRITE);CNewSocket:OnSend(int nErrorCode)send(m_szBuffer,m_nLength,0);第第10章章 网络程序设计实例网络程序设计实例 2创建一个用于建立连接的类CMyServerSocket创建一个用于建立连接的类CMyServerSocket,并重载CAsyncSocket类的OnAccept()函数。在MyServerSocket.h中声明如下变量:public:C

    35、NewSocket*m_pSocket;OnAccept()程序的代码如下:void CMyServerSocket:OnAccept(int nErrorCode)第第10章章 网络程序设计实例网络程序设计实例/侦听到连接请求,调用Accept函数CNewSocket*pSocket=new CNewSocket();if(Accept(*pSocket)pSocket-AsyncSelect(FD_READ);m_pSocket=pSocket;else delete pSocket;第第10章章 网络程序设计实例网络程序设计实例 3为对话框添加一个“侦听”按钮为对话框添加一个“侦听”按钮

    36、,并添加如下代码。在CSockServerDlg.ccp中声明变量:public:CMyServerSocket m_srvrSocket;OnListen()函数的代码如下:void CCSockServerDlg:OnListen()if(m_srvrSocket.m_hSocket=INVALID_SOCKET)BOOL bFlag=m_srvrSocket.Create (UserPort,SOCK_STREAM,FD_ACCEPT);if(!bFlag)第第10章章 网络程序设计实例网络程序设计实例 AfxMessageBox(Socket Error!);M_srvrSocket.

    37、Close();PostQuitMessage(0);Return;/侦听成功,等待连接请求if(!m_srvrSocket.Listen(1)第第10章章 网络程序设计实例网络程序设计实例 int nErrorCode=m_srvrSocket.GetLastError();if(nError!=WSAEWOULDBLOCK)AfxMessageBox(Socket Error!);M_srvrSocket.Close();PostQuitMessage(0);Return;第第10章章 网络程序设计实例网络程序设计实例 10.3 基于WinInet API的客户程序编写实例10.3.1 应

    38、用程序说明编程环境:VC+6.0。程序功能:给定Internet中一台服务器的域名,客户机首先与该域名的服务器建立连接,然后查询该服务器提供的功能。当然用户也可以随便输入一个域名,看是否在Internet中有该域名的服务器。第第10章章 网络程序设计实例网络程序设计实例 10.3.2 建立应用程序的用户操作界面编写该程序要求用户对VC的编程环境比较熟悉。在该程序中我们建立一个基于对话框的用户界面。1使用AppWizard生成对话框程序框架(1)在VC启动后,从“文件”菜单中选择“新建”,在“新建”对话框中选择使用MFC的应用程序生成向导建立一个应用程序,即选择“MFC AppWizard(ex

    39、e)”,然后在“工程”框内输入要新建工程的名称,在该例中我们取名为scan,再单击“确定”按钮,如图10-6所示。第第10章章 网络程序设计实例网络程序设计实例 图10-6 创建一个WinInet应用程序第第10章章 网络程序设计实例网络程序设计实例(2)在弹出的“MFC AppWizard-step 1”对话框中,选择基于对话框的(Dialog Based)应用程序类型,然后单击“下一步”按钮。(3)在弹出的“MFC AppWizard-step 2 of 4”对话框中,取消ActiveX Controls控件的选中标记,并且注意不要选择“Windows Sockets”,因为在该程序中我们

    40、不直接调用Windows Sockets函数;在对话框标题栏中输入“服务器功能扫描程序”,再单击“下一步”按钮。(4)在弹出的“MFC AppWizard-step 3 of 4”对话框中,选择MFC所使用的链接库,一般选择静态链接库,再单击“下一步”按钮。第第10章章 网络程序设计实例网络程序设计实例 (5)在“MFC AppWizard-step 4 of 4”对话框中,一般不需要改变MFC AppWiard自动生成的各种类名,直接按“完成”按钮即可,这时弹出一个新建的有关工程和信息的对话框。2编程对话框(1)添加一个显示输出结果的编辑框。使用VC的资源工具给对话框添加一个编辑框,然后右击

    41、编辑框,在弹出的下拉菜单中选择“Properties”,在弹出的编辑控件属性对话框中,将资源的ID标识符设置为IDC_EDIT1,再给该编辑框增加一些其他类型属性。如在“Styles”选项卡中,选中图10-7所示的“Mutiline”等属性。第第10章章 网络程序设计实例网络程序设计实例 图10-7 属性对话框 第第10章章 网络程序设计实例网络程序设计实例(2)添加一个输入网址的编辑框。用与上面类似的方法再增加另一个编辑框,编辑框的ID标志设为IDC_EDIT2,然后在属性对话框中选择“Mutiline”和“Want return”属性。(3)添加查询命令按钮。在对话框上的恰当位置添加5个按

    42、钮,这5个按钮分别用来实现HTTP、FTP、Gopher、FINGER和WHOIS查询功能,它们的ID标志分别设置为I D C _ B U T TO N _ H T T P、I D C _ B U T T O N _ F T P、IDC_BUTTON_GOPHER、IDC_BUTTON_FINGER和IDC_BUTTON_WHOIS。在上面的操作完成以后,适当调整这些资源的布局,使用户界面比较美观。最后的结果如图10-8所示。第第10章章 网络程序设计实例网络程序设计实例 图10-8 应用程序对话框 第第10章章 网络程序设计实例网络程序设计实例 10.3.3 应用程序代码及其说明1给编辑框添

    43、加变量为了完成程序的显示和输入功能,需要给编辑框添加对应的变量。为了简单起见,我们可以使用“ClassWizard”给编辑框添加变量。编辑框IDC_EDIT1附加的变量为m_out,编辑框IDC_EDIT2附加的变量为m_host,它们都应为CString类型的变量。第第10章章 网络程序设计实例网络程序设计实例 2HTTP协议查询代码给对话框类CScanDlg添加一个函数,用于实现HTTP查询。函数原形为:void TryURL(CString URL);其实现代码为:void CScanDlg:TryURL(CString URL)CInternetSession session;m_ou

    44、t+=正在链接+URL+rn;第第10章章 网络程序设计实例网络程序设计实例 UpdateData(FALSE);CInternetFile*file=NULL;tryfile=(CInternetFile*)session.OpenURL(URL);catch(CInternetException*pEx)file=NULL;pEx-Delete();第第10章章 网络程序设计实例网络程序设计实例 if(file)m_out+=已建立链接。rn;CString line;for(int i=0;iReadString(line);i+)m_out+=line+rn;file-Close();

    45、delete file;第第10章章 网络程序设计实例网络程序设计实例 elsem_out+=本地址没有发现http主机rn;m_out+=-rn;UpdateData(FALSE);第第10章章 网络程序设计实例网络程序设计实例 下面,我们分析一下这个函数是如何实现HTTP链接的。首先,根据我们在第9章所学的知识,需要建立一个Internet会话,这就要定义一个CInternetSession的对象。其构造函数的原形如下:CInternetSession(LPCTSTR pstrAgent=NULL,DWORD dwContext=1,DWORD dwAccessType=INTERNET_

    46、OPEN_TYPE_PRECONFIG,L P C T S T R p s t r P r o x y N a m e=N U L L,L P C T S T R pstrProxyBypass=NULL,DWORD dwFlags=0);第第10章章 网络程序设计实例网络程序设计实例 这个函数需要定义很多参数,但本程序都使用缺省值,即“=”号后的值。CInternetSession构造函数参数说明如下:LPCTSTR pstrAgent:应用程序名,如果为NULL,将填入在AppWizard中给定的程序名。DWORD dwContext:本操作的设备关联符定义。DWORD dwAccessT

    47、ype:访问类型,可以为以下参数之一:INTERNET_OPEN_TYPE_PRECONFIG(default),INTERNET_OPEN_TYPE_DIRECT或INTERNET_OPEN_TYPE_PROXY。第第10章章 网络程序设计实例网络程序设计实例 LPCTSTR pstrProxyName:如访问类型为INTERNET_OPEN_TYPE_PROXY,则给该参数赋予协议名称。LPCTSTR pstrProxyBypass:如访问类型为INTERNET_OPEN_TYPE_PROXY,则该参数为不通过协议服务器而直接链接的一系列地址。D W O R D d w F l a g s

    48、:可 为 以 下 参 数:INTERNET_FLAG_DONT_CACHE,INTERNET_FLAG_ASYNC和INTERNET_FLAG_OFFLINE。第第10章章 网络程序设计实例网络程序设计实例 DWORD dwAccessType:值缺省时将使用系统注册簿定义的值。显然,程序允许使用者定义访问类型将比由程序内部直接定义要好。因此,要正确使用本程序,必须先在Windows系统中定义好网络访问类型,步骤如下:(1)双击桌面上“我的电脑”图标。(2)双击“控制面板”。(3)点击“Internet”。(4)在随后弹出的对话框中选择“连接”,然后填写网络连接属性。如果是通过拨号上网的,选中

    49、“拨号设置”选择项,并填写相关属性;如果是局域网(LAN)上网的,则要进入局域网(LAN)设置代理服务器的地址和端口号。第第10章章 网络程序设计实例网络程序设计实例 注意:如果所使用的计算机已经接入Internet,则不需要进行如上设置。本程序在构造CInternetSession对象时使用缺省值,因此,构造函数将不带任何参数,如下所示:CInternetSession session;在构造对象session后,如下两行程序进行输出提示,表示程序已开始工作:m_out+=正在链接+URL+rn;UpdateData(FALSE);第第10章章 网络程序设计实例网络程序设计实例 接下来使用s

    50、ession对象的成员函数OpenURL()来打开一个URL资源。该函数返回一个文件的指针,文件类型为以下四种之一:file:/如果访问的是本地机器,函数返回一个CStudioFile类对象的指针ftp:/如果访问的是FTP地址,函数返回一个CInternetFile类对象的指针gopher:/如果访问的是Gopher地址,函数返回一个CGopherFile类对象的指针http:/如果访问的是HTTP地址,函数返回一个CHttpFile类对象的指针第第10章章 网络程序设计实例网络程序设计实例 本程序用于访问远程机器,因此,函数不会返回一个file:/类型的本地文件。而CGopherFile和

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《TCP IP协议与网络编程》课件第10章 网络程序设计实例.ppt
    链接地址:https://www.163wenku.com/p-7862584.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库