windows 网络程序设计教案Word下载.docx
《windows 网络程序设计教案Word下载.docx》由会员分享,可在线阅读,更多相关《windows 网络程序设计教案Word下载.docx(64页珍藏版)》请在冰豆网上搜索。
【教学内容】:
理论课(2课时):
Internet介绍,TCP/IP协议概述(前半部分),SOCKET简介(课件参见“TCP/IP协议概述.ppt”)
上机课(4课时):
上机课练习题目:
“基于Winsock方式的网络聊天室”
练习的主要目的:
理解并掌握基于TCP/IP的Winsock方式网络编程流程和具体方法。
练习方式:
首先编译提供的“基于Winsock方式的网络聊天室”程序。
执行该程序。
第2步,每2或3个人一组,熟悉程序操作,使用、并体会一下。
第3步,分析该程序的结构,比如,程序有那些类,使用的什么基
本技巧。
。
等等,在了解程序结构的基础上,进行相应的修改。
具
体修改的内容是:
在聊天室显示窗口中,显示出各个参与聊天者的IP地址。
要求掌握并理解的有关内容:
1C/S结构(Client/Server,“客户端/服务器”结构)的理解。
2初始化Socket的语句:
WSADATAwsaData;
WORDversion=MAKEWORD(2,0);
intret=WSAStartup(version,&
wsaData);
if(ret!
=0)
{
TRACE("
InitilizeError!
\n"
);
//初始化失败
AfxMessageBox("
Failedininitialsocket"
}
3在服务器端建立监听的语句:
if(m_hSocket!
=NULL)
//如果已经创建了套接字先关闭原来的
closesocket(m_hSocket);
m_hSocket=NULL;
if(m_hSocket==NULL)
//创建新的套接字,这里是创建的流类型的套接字
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
ASSERT(m_hSocket!
=NULL);
ServerInit();
m_addr.sin_family=AF_INET;
m_addr.sin_addr.S_un.S_addr=INADDR_ANY;
m_addr.sin_port=htons(m_uPort);
intret=0;
interror=0;
//绑定一个套接字到本机的地址
ret=bind(m_hSocket,(LPSOCKADDR)&
m_addr,sizeof(m_addr));
if(ret==SOCKET_ERROR)
{//绑定错误
BindingError"
returnFALSE;
//开始一个侦听过程,等待客户的连接
ret=listen(m_hSocket,5);
//这里的第二个参数表示最多支持的客户连接数
{//listen失败
ListenError"
4客户端的连接(connect)语句:
ret=connect(m_hSocket,(LPSOCKADDR)&
5链表类的应用:
Clist
6如何建立基于消息机制的异步Socket操作:
if(WSAAsyncSelect(m_hSocket,m_hWnd,CLI_MESSAGE,FD_READ|
FD_WRITE|FD_CLOSE|FD_CONNECT)>
0)
Errorinselect"
7如何将异步Socket消息机制与程序结合在一起:
●消息定义:
#defineSER_MESSAGEWM_USER+100
#defineCLI_MESSAGEWM_USER+101
●消息映射:
ON_MESSAGE(SER_MESSAGE,OnServerMessage)
ON_MESSAGE(CLI_MESSAGE,OnClientMessage)
●消息函数:
OnClientMessage(WPARAMwParam,LPARAMlParam)
OnServerMessage(WPARAMwParam,LPARAMlParam)
【课堂小结】:
总结一下授课的重点,提请学生们注意所学习的重点和难点。
【作业布置】:
完成课堂上没有结束的程序。
【教学后记】:
二
基于CSocket方式的网络聊天室
Windows平台的CSocket编程方法
体会CSocket与异步方式实现网络通讯程序的不同
使用VC++编写基于不同实现方法的网络通讯程序
重点是使用VC++编写基本的CSocket通讯程序;
CSocket的理解和使用。
SOCKET详解,TCP/IP协议概述(后半部分)(课件参
见
“SOCKET.ppt”
“TCPIP协议概述.ppt”)
“基于CSocket方式的网络聊天室”
理解并掌握基于TCP/IP的CSocket方式网络编程流程和具体方法。
首先编译提供的“基于CSocket方式的网络聊天室”程序。
熟悉程序操作,使用、并体会一下与Winsock界面有什么不同(IP地址显示出来了)。
然后,分析该程序的结构,比如,程序有那些类,使用的什么基本
技巧。
等等(由教师详细分析),在了解程序结构的基础上,由
学生自己建立一个新的工程,并对照教师提供的源代码,重写该聊
天室程序。
如果有时间,在聊天室显示窗口中,显示出各个参与聊天者
的名字。
8理解CSocket。
9初始化的语句:
if(AfxSocketInit(NULL)==0)
CSocketInitalError"
10在服务器端建立监听的语句:
11客户端的连接(connect)语句:
12链表类的应用:
Ptrlist
13如何建立基于Archive的Socket操作:
14如何将Archive机制与CSocketFile结合在一起:
15参见课件幻灯片《VC++代码中的一些常用概念.ppt》第16、17页CCocket工作原理。
三
基于控制台方式的“点对点”简单文件传送
重点是了解阻塞方式的SOCKET编程方法;
阻塞方式的SOCKET的理解和使用,以及流方式的文件打开,读
取,求文件大小(长度)等技巧。
IP协议详解(课件参“IP详解.ppt”)
“一:
基于控制台方式的简单文件传送”
理解并掌握阻塞方式的SOCKET简单的文件传送编程流程和方法。
首先编译教师提供的“基于控制台方式的简单文件传送”程序。
熟悉程序操作,使用、并体会程序的操作。
然后,由教师详细分析程序,在了解程序结构的基础上,由学生自
己建立一个新的工程,并对照教师提供的源代码,重写该程序的代
码。
如果有兴趣,在必要的位置,增加提示信息,如,传输进度等。
一:
基于控制台方式的简单文件传送
1回顾基于控制台方式的Window应用程序开发,并且使用VC++环境创建这类应用。
main(intargc,char*argv[],char*envp[])
{
语句
}
命令行参数的含义(注意:
在VC++环境下,编写“非窗口”的程序,也是经常的。
)
2了解阻塞方式的SOCKET编程方法
3了解流方式的文件打开,读取,求文件大小(长度)等技巧
4本例程的不足之处:
*之所以称做“简单文件传送”,那么大文件(文件大小超过65535)则无法传送!
(为什么?
*一次只能为一个客户传送文件(为什么?
另外,请同学们思考:
*该文件传送程序,大文件(大小超过65535)则无法传送!
*一次只能为一个客户传送文件(为什么?
四
基于Windows窗口方式的“点对点”文件传送
Windows平台的异步消息方式的编程方法
体会异步消息方式的的优势
重点是了解基于异步消息方式的SOCKET编程方法;
异步消息方式的SOCKET的理解和使用,以及Windows标准方式文
件的打开,读取,求文件大小(长度)等技巧。
“基于Windows窗口方式的‘点对点’文件传送”
理解并掌握基于Windows窗口方式的文件传送编程流程和
方法。
由教师详细分析程序,在了解程序结构的基础上,学生将
程序改进为可以双向传送文件。
(教师提供的代码是从服
务器端单向传送文件的)
如果有兴趣,在必要的位置,增加提示信息,如,传输进
度等。
一,关键的仍然是如何建立基于消息机制的异步Socket操作:
if(WSAAsyncSelect(m_hSocket,m_hWnd,CLI_MESSAGE,
FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT)>
二,至于如何将文件发送到对方,教师的方法仅供参考
三,参考下面界面:
*该文件传送程序,与前面介绍的简单文件传送的不同之处
*该程序的不足之处
补充程序,使之完善(增加CLIENT
端传送文件的功能)
五
实现PING功能
学会如何使用VC++编写网络协议的方法
体会网络协议编程的方式
理解VC++编写的网络通讯协议软件的具体方法
重点是了解如何灵活运用ICMP协议去编制PING应用程序。
实现ICMP协议的技巧。
ICMP协议介绍(课件参“ICMP详解.ppt”)
“实现PING功能”
在编写Ping程序的过程中,学会编写网络协议的技巧,同时理解
ICMP协议,重点是ICMP中的Echo和EchoReply。
教师详细分析程序,然后由同学们单独完成。
按照下面步骤展开。
要求掌握并理解的有关内容以及上机练习一些说明:
16新建项目,使用AppWizard创建一个基于对话框形式的应用程序,首先完成下面工作:
●主机/IP地址输入的编辑框
●按钮,用来开始PING的功能
●一个CHECKBOX控件用来记录PING的路由
●一个用来显示PING结果的编辑框
如下所示:
这些具体的有关VC++基础编程不细说了。
17实现一个封装ICMP-PING功能的类:
classCPing
18理解并掌握对所谓协议的封装是如何实现的:
(重要!
使用结构:
typedefstruct_iphdr
unsignedinth_len:
4;
//Lengthoftheheader注:
此处需要注意!
unsignedintversion:
//VersionofIP
unsignedchartos;
//Typeofservice
unsignedshorttotal_len;
//Totallengthofthepacket
unsignedshortident;
//Uniqueidentifier
unsignedshortfrag_and_flags;
//Flags
unsignedcharttl;
//Timetolive
unsignedcharproto;
//Protocol(TCP,UDPetc)
unsignedshortchecksum;
//IPchecksum
unsignedintsourceIP;
unsignedintdestIP;
}IpHeader;
typedefstruct_icmphdr
BYTEi_type;
BYTEi_code;
//Typesubcode
USHORTi_cksum;
USHORTi_id;
USHORTi_seq;
//Thisisnotthestandardheader,butwereservespacefortime
ULONGtimestamp;
}IcmpHeader;
//
//IPoptionheader-usewithsocketoptionIP_OPTIONS
typedefstruct_ipoptionhdr
unsignedcharcode;
//Optiontype
unsignedcharlen;
//Lengthofoptionhdr
unsignedcharptr;
//Offsetintooptions
unsignedlongaddr[9];
//ListofIPaddrs
}IpOptionHeader;
19Socket的启动:
还记得吗?
WSADATAwsaData;
if(WSAStartup(MAKEWORD(2,2),&
wsaData)!
Sorry,youcannotloadsocketdll!
"
return;
}
20创建Socket的方法(注意与普通的不同“SOCK_RAW”)
m_hSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,
WSA_FLAG_OVERLAPPED);
对比:
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
SOCK_RAW(原始套接字)保存了数据包中的完整IP头,而SOCK_DGRAM、
SOCK_STREAM两种套接字只能收到用户数据。
因此可以通过原始套接字对
数据进行分析。
将原始代码,复制到自己建立的工程中。
*如何实现更高级的ICMP协议功能。
有兴趣的同学,可以编写实现更多功能的ICMP协议。
六
获取本机网络信息的若干程序
(一)
学会如何使用VC++编写程序获取本机网络信息
通过自己编写的代码,体会如何获取本机网络信息的方法
了解VC++编写的网络通讯软件的某些基础函数
重点是了解如何运用VC++提供的若干与获取本机网络信息相关的
函数。
理解本地网络设置以及相关VC++设计技巧
LAN原理(第一部分)(课件参“LAN原理.ppt”)
题目:
“书签形式的获取本地计算机网络资源程序”
掌握获取本机网络信息的编程方法。
由教师详细分析程序,在了解程序结构的基础上,由
学生自己建立一个新的工程,并对照教师提供的源代码,重写
部分程序的代码。
学会从注册表中获取网络资源,及其编程技巧。
练习
标签页的编程。
教师详细分析程序,然后由同学们单独完成一项新的查询功能。
具体的,由学生在原来基础上添加一个获取DNS的标签页。
●有关VC++基础编程
●标签页的应用及其实现方法。
●理解并掌握如何从注册表中获取资源(重要!
学会两种操作注册表的函数。
值得注意的是:
注册表----注册表结构,不同的操作系统也许不同!
(Win2003,WinNT)
七
获取本机网络信息的若干程序
(二)
LAN原理(第二部分),TCP协议详解(第一部分)
(课件参“LAN原理.ppt”,“TCP协议.ppt”)
“书签形式的获取本地计算机网络资源程序
(2)”
掌握获取本地网络信息的编程方法。
学会几种获取网络资源的Socket函数:
getservbyname()、getservbyport(),WNetEnumResource()。
及其编程
复习标签页的编程。
了解如何阅读MSDN的帮助(重要!
教师分析程序,然后由同学们单独完成几项新的查询功能。
具体的,首先,由学生在原来基础上添加使用getservbyport
()函数显示协议的的功能。
1、有关VC++基础编程
复习标签页的应用及其实现方法。
2、理解并掌握几种如何获取资源的Socket函数(重要!
学会getservbyname()、getservbyport(),WNetEnumResource()函数。
3、参考资料(有MSDN的同学可以直接阅读):
结构:
SERVENT
structservent{
charFAR*s_name;
charFAR*FAR*s_aliases;
shorts_port;
charFAR*s_proto;
};
Themembersofthisstructureare:
Element
Usage
s_name
Officialnameoftheservice.
s_aliases
ANULL-terminatedarrayofalternatenames.
s_port
Theportnumberatwhichtheservicecanbecontacted.Portnumbersarereturnedinnetworkbyteorder.
s_proto
Thenameoftheprotocoltousewhencontactingtheservice.
函数:
(一)getservbyname()
TheWindowsSocketsgetservbynamefunctionretrievesserviceinformationcorrespondingtoaservicenameand