1、网络编程入门授课教师:网络编程网络编程导入 计算机和网络通信的出现给人们的生活带来了革命性的变化 计算机的硬件离不开软件,通信软件使计算机网络硬件的具体功能得以实现 Microsoft Visual C+是由微软开发的可视化软件开发平台,具有强大面向对象功能,可以开发开发网络通信软件 本章要点Visual C+6.0开发平台的基本使用技巧网络通信编程基本原理常见网络工具软件分析Visual C+6.0开发平台 Visual C+6.0是微软推出的产品,它提供了强大的编译能力以及良好的界面操作性。能够对C+程序设计提供完善的编程环境。Visual C+6.0是可视化软件开发平台,具有强大面向对象
2、功能 在此平台下可以利用微软已经封装好的基本类库,开发网络通信软件。使用Visual C+6.0创建一个新工程 第一步:启动并进入Visual C+6.0的集成开发环境。创建一个新工程 选择“文件”“新建”,在弹出的对话框中选择新建工程的类型创建一个新工程创建一个新工程新工程的运行结果Visual C+6.0项目文件Visual C+6.0项目中的主要文件.dsp:VC开发环境生成的工程文件,非常重要。.dsw:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。.ncb:ncb是“No Compile Browser”的缩写,其中存放了供ClassView
3、、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。.rc:资源定义文件。.clw:ClassWizard生成的用来存放类信息的文件。.aps:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。.h:用C/C+语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。.cpp:用C+语言编写的源代码文件。Visual C+6.0调试工具 调试工具 网络通信基础面向连接的服务 VS 面向无连接的服务 面向连接的服务:发送信息的源计算机必
4、须首先与接收信息的目的计算机建立连接。一旦连接建立起来,相互连接的计算机就可以进行数据交换。它是可靠的。面向无连接的服务:发送信息的计算机把数据以一定的格式封装在数据帧中,把目的地址和源地址加在信息头上,然后把帧交给网络进行发送。无连接服务是不可靠的。计算机网络分层TCP/IP协议主要协议在网络层中的分布情况主要网络协议 TCP协议:传输控制协议(Transmission Control Protocol)。是面向连接的协议,它可以提供可靠传输服务。UDP协议:用户数据报协议(User Datagram Protocol)。UDP协议提供了用户进程的无连接服务。HTTP协议:超文本传输协议(H
5、ypertext Transfer Protocol)。提供了网页浏览服务,是现在应用最广的协议之一。FTP协议:文件传输控制协议(File Transfer Protocol)。提供了文件的传输功能和一些常用的文件操作。SMTP协议:简单邮件传输协议(Simple Mail Transfer Protocol)。提供了邮件的传送服务。主要网络协议 TELNET协议:终端协议(Telnet Terminal Protocol)。提供了远程登录服务,允许用户以虚拟终端方式访问远程主机。ICMP协议:网间报文控制协议(Internet Control Message Protocol),它的功能是
6、处理IP主机或者路由器之间的差错和传输控制。ARP协议:地址解析协议(Address Resolution Protocol)。它的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。RARP协议:反向地址解析协议(Reverse Address Resolution Protocol)。负责把主机硬件地址映射为网络地址,也就是把MAC地址转化为对应的IP地址。RARP协议的功能与ARP协议恰恰相反。网络程序设计模型C/S结构 C/S结构是网络程序设计的基本模型,它是一个典型的分布式结构。在C/S结构中,服务器程序始终处于监听状态,当被监听的服务端口处有服务请求
7、时,立即响应客户的服务请求。客户机在发出服务请求信号前,必须指定服务器地址和端口号才能获得相应的服务。C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器,客户端响应速度快。服务器端:1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到达该端口。3、接收到重复服务请求,处理该请求并发送应答信号。4、返回第二步,等待另一客户请求5、关闭服务器。客户端:1、打开一通信通道,并连接到服务器所在主机的特定端口。2、向服务器发送服务请求报文,等待并接收应答;继续提出请求3、请求结束后关闭通信通道并终止。请求和应答请求的基本过程
8、套接字编程的基本原理什么是套接字?套接字(socket)是网络计算机与应用程序之间发送和接收数据的方式的一种抽象描述。它描述了两个通信点之间的连接。确切的说,套接字(socket)是用来实现主机和主机通信的一个接口。通过它可以完成主机间的通信操作,它位于协议之上,屏蔽了底层的协议,让用户能够实现各种类型的通信操作。最常用的套接字类型有三种 流(Stream)套接字用于提供面向连接、可靠的数据传输服务。数据报(Datagram)套接字提供了一种无连接的服务,是不可靠的。原始(Raw)套接字原始套接字可以读写内核没有处理的IP数据包。讨论:我们经常使用的网络通信软件有哪些?我们机房使用的电子教室软
9、件有哪些功能?扫描可控计算机授课教师:网络编程网络编程导入 电子教室软件主要功能是教师可以通过教师机程序控制和管理学生机 教师机端控制程序能够主动扫描学生机,确定哪些学生已经进入电子教室,是可控计算机 本章通过简单的通信程序实现扫描局域网内可控计算机的功能 本章要点扫描可控计算机功能实现分析WinSock通信编程技术MFC网络通信编程技术扫描可控计算机功能需求分析 教师机主动联系学生机,如果不能与学生机建立联系,则说明学生机端没有运行该程序,该学生机不在可控范围;反之,如果教师机与学生机成功的取得了联系,则证明学生机已启动程序,处于可控状态。教师机扫描学生机时,应该可以设置扫描范围,例如一个I
10、P地址范围,教师机与范围内的所有学生机逐一联系,判断其是否处于可控状态,将处于可控状态的学生机显示在教师机端的程序界面上。设计程序界面 关键技术分析 关键技术就是两台联网的计算机之间进行通信 采用什么技术实现网络通信?套接字(Socket)WinSock进行面向连接通信编程WinSock实现基于TCP的客户端/服务器通信 程序演示 程序源代码(见教材P18)程序代码详解头文件和库文件#include#pragma comment(lib,ws2_32.lib)使用WinSock进行编程开发,需要头文件和库文件ws2_32.lib的支持。程序代码详解 WSADATA1.WSADATA wsaDa
11、ta;2.if(ret=WSAStartup(MAKEWORD(2,2),&wsaData)!=0)3.4.printf(初始化WinSock出错);5.return 0;6.7.WSACleanup();程序代码详解 socket 调用Socket()函数可以建立套接字 函数原型:SOCKET socket(int af,int type,int protocol)参数af:套接字要使用的协议地址族,目前只提供AF_INET表示使用互联网协议(IP)地址。参数type:描述套接字的类型,只能是SOCK_STREAM、SOCK_DGRAM、SOCK_RAW 中的一个。参数protocol:该套
12、接字使用的特定通信协定(如果使用者不指定则设为0)。程序代码详解bind 调用bind()函数为服务器端定义的监听套接字指定一个地址及监听端口(Port)int bind(SOCKET s,const Struct sockaddr FAR*name,int namelen);参数s:未绑定的套接字的对象名。参数name:套接字的地址值,是个结构体。参数namelen:地址参数name的长度。程序代码详解listen listen函数在TCP服务器端使用,通知协议内核用户进程准备接受接口上的连接请求 int listen(SOCKET s,int backlog);参数s:已绑定但尚未连接的套
13、接字句柄,也是由socket()函数创建的套接字句柄。参数backlog:待处理的连接队列的最大长度。当连接的客户数大于这个最大长度并且服 程序代码详解accept accept函数在服务器端等待并接受客户的连接,该函数返回一个新的套接字,该套接字可以用来与对方进行通信,而原先的套接字还是处于监听状态。int accept(SOCKET s,struct sockaddr FAR*addr,int FAR*addrlen);参数s:表示处于监听模式的套接字句柄。参数addr:是SOCKADDR对象的地址。参数addrlen:表示addr参数的长度。程序代码详解send send函数发送数据 i
14、nt send(SOCKET s,const char FAR*buf,int len,int flags);参数s:表示已连接的本地套接字描述符。参数buf:表示要发送的缓冲区数据。参数len:表示缓冲区的长度。参数flags:表示标志类型,可以为0,MSG_DONTROUTE,MSG_OOB。程序代码详解recv recv函数从TCP连接的另一端接收数据 int recv(SOCKET s,char FAR*buf,int len,int flags);参数s:接收端套接字描述符。参数buf:指明一个缓冲区,用来存放接收到的数据。参数len:buf的长度。参数flags:表示标志,可以是0
15、,MSG_PEEK,MSG_OOB。一般置0。程序代码详解 connect Connect函数完成通信的连接过程 int connect(SOCKET s,const struct sockaddr FAR*name,int namelen);参数s:表示是将要和服务器建立连接的套接字句柄。参数name:服务器的地址结构 参数namelen:地址名字name的长度。MFC的CSocket类 微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。MFC中的CAsyncSocket类逐个封装了WinSock API CSocket类是由CAsyncSocket继承
16、而来,继承了它封装的WinSock API CSocket类实现网络通信编程过程 1.构造一个CSocket对象。2.使用这个对象的Create()成员函数产生一个socket对象。在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方程序,必须在调用Create时指定一个端口。3.如果是客户方套接字,则调用Connect()函数与服务方套接字连接;如果是服务方套接字,则调用Listen()开始监听来自客户方的连接请求,收到连接请求后,调用Accept()函数接受请求,建立连接。4.连接成功建立后,可以使用Receive()和Send()函数进行数据
17、发送和接收工作。5.通信结束后,使用Close()函数销毁CSocket对象。CSocket类实现的面向连接的套接字通信过程 代码详解头文件#include 头文件afxsock.h中包含 CAsyncSocket 和 CSocket 类定义。代码详解 Create函数 BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);参数nSock
18、etPort:与套接字一起使用的端口号,默认值为0,表示自动选择端口号。参数nSocketType:指定要创建的套接字类型,默认为流式套接字。参数lEvent:指定感兴趣的网络事件的掩码位。参数lpszSocketAddress:指定套接字的网络地址。代码详解 Listen函数 BOOL Listen(int nConnectionBacklog=5);参数nConnectionBacklog:指定连接请求队列的最大连接数目,默认为5。代码详解Accept函数 virtual BOOL Accept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAd
19、dr=NULL,int*lpSockAddrLen=NULL);参数rConnectedSocket:用来进行连接的新套接字的引用。参数lpSlpSockAddr:用来返回发送连接请求的套接字地址的SOCKADDR结构指针。参数lpSockAddrLen:指向pSockAddr结构中地址的字节长度的指针。代码详解 Connect函数 BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort);参数lpszHostAddress:用于要连接的服务器网络地址。参数nHostPort:指定套接字应用程序使用的端口号。代码详解Receive函数 virtu
20、al int Receive(void*lpBuf,int nBufLen,int nFlags=0);参数lpBuf:接收数据的缓冲区。参数nBufLen:缓冲区的字节节长度。参数nFlags:用来表示函数的实现,默认为0。代码详解Send函数 virtual int Send(const void*lpBuf,int nBufLen,int nFlags=0);参数lpBuf:要发送的数据的缓冲区地址。参数nBufLen:lpBuf缓冲区的字节长度。参数nFlags:指定函数的调用标志,默认值为0。代码详解Close函数 该函数用来关闭套接字并释放Socket描述符,其函数原型为:Virt
21、ual void Close();扩展核心程序 首先建立两个应用程序,一个teacher和一个student。student程序应首先启动,teacher程序能够主动向所有student程序发出连接请求 能够成功建立连接的学生机就是可控学生机,把其IP地址显示在teacher程序界面上。本章技能训练实例 实验题目:简单的考试报名系统实现 实验目的:掌握使用Socket进行通信的基本方法和简单控件编程 实验内容:开发一个服务器端程序,能够接收客户端发来的信息;开发一个客户端程序,能够将信息发送给服务器端,可采用CSocket编程,也可以用WinSock编程。文件传输授课教师:网络编程网络编程导入
22、 在电子教室软件系统中,教师经常需要通过教师机向所有学生下发文件,传递授课资料,有时也需要学生将完成的作业上传到教师机,这就涉及到一个文件传输的问题,本章我们就通过一个简单的文件传输程序。本章要点 文件传输功能分析设计 文件操作编程技术 多线程编程技术 文件下发程序实现功能需求分析 包含两个程序,一个发送端程序,一个接收端程序。发送端程序可以由用户选择要发送的文件。发送端程序可以指定发送对象,可以是一个IP范围,也可以是某个IP地址。接收端程序可以由用户指定接收到的文件的存放地址。界面设计 关键技术分析 文件传输的本质用一句话概括就是:发送方将文件数据读出来,然后调用套接字的发送函数将数据传输
23、到接收方,接收方调用套接字接收函数接收数据,然后重新建立文件并将数据写入文件。文件传输流程 发送文件功能的实现接收文件功能的实现流程代码详解文件操作 CFile类:CFile类是MFC文件类的基类,提供非缓冲方式的二进制磁盘输入、输出功能;并直接通过派生类来支持文本文件和内存文件。提供访问本地文件内容的功能,不支持访问网络文件的功能。使用CFile操作文件的基本过程是:定义CFile对象打开要操作的文件 对文件/写文件关闭文件文件操作Open()函数 该函数的功能是打开指定文件。BOOL CFile:Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFile
24、Exception*pException)参数lpszFileName:带完整路径的文件名,指定要打开的文件。参数nOpenFlags:指定文件打开方式,可以是多个标志的组合。文件操作Read()函数 该函数的功能是从文件中读取文件内容。virtual UINT CFile:Read(void*lpBuf,UINT nCount);参数lpBuf:存放读出的文件内容的空间地址。参数nCount:从文件读出的最大字节数。文件操作 Write()函数 该函数的功能是向文件中写数据 virtual void Write(const void*lpBuf,UINT nCount);参数lpBuf:存储
25、要写入文件的数据的空间地址。参数nCount:要写入文件的数据的字节数。文件操作 Close()函数 功能是关闭文件句柄。文件操作完毕必须调用Close()函数关闭文件。第一步程序扩展实现较大文件的传输 上面文件传输实例的功能并不强大,但是它的实现过程很简单,说明了文件传输的原理。它忽略了真实文件的大小在上面的代码中,为了从文件中读取数据,首先获得文件长度,然后开辟一段和文件长度匹配的内存作为文件缓冲。但现在很多文件动辄几百兆字节,往往无法一次开辟如此大的内存容纳如此多的数据。所以对于大文件传输,这段代码显然不合适。解决方法:分段缓冲文件数据。实现方法详见代码 第二步程序扩展同时向多个目标传输
26、文件 教师机通常需要控制整个教室所有的学生机,需要进行一对多的文件传输 需要用户在界面上指出需要发送文件的对象(例如学生机的IP地址范围)考虑传输效率,需要采用多线程技术。什么是多线程技术?多线程是为了同步完成多项任务 多线程不是为了提高运行效率,而是为了通过提高资源使用效率来提高系统的效率。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行,也可以把它理解为代码运行的上下文。线程负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。实现发送文件功能的主线程流程 多线程实现代码 在本程序中,多线程编程涉及三处代码,第一处是创建一个新线程,使用CreateThread
27、函数:CreateThread(NULL,0,SendFileThread,(LPVOID)pMeg,NULL,NULL);函数CreateThread是微软在Windows API中提供的,可用于建立新线程。CreateThread将在主线程的基础上创建一个新线程。多线程实现代码 第二处是定义线程函数:ULONG WINAPI SendFileThread(LPVOID p);SendFileThread是线程的名字,可根据需要自行定义 应该定义在对应的头文件中,且一定要定义为全局的。多线程实现代码 第三处是线程函数的实现:ULONG WINAPI SendFileThread(LPVOID
28、 p)/此处写实现线程具体功能的代码 线程的参数传递 考虑到在创建每个新线程时,需要将待发送文件的地址和发送对象的IP地址传递给新线程,因此需要传递两个字符串参数给线程,按照创建线程函数的定义,只能传递一个指向结构的指针,因此需要定义一个结构体,专门存放需要传递给线程的数据。结构体定义如下:typedef struct char ip15;/文件传递目的地IPchar fileAddr50;/带路径的文件名 myMeg;线程的参数传递1.myMeg*pMeg;/定义一个指向myMeg结构体的指针2.pMeg=(myMeg*)malloc(sizeof(myMeg);/给指针分配空间3.memc
29、py(pMeg-ip,ip,15);/将IP地址放入结构体4.memcpy(pMeg-fileAddr,file,50);/将文件地址放入结构体5.CreateThread(NULL,0,SendFileThread,(LPVOID)pMeg,NULL,NULL);/创建一个新线程,将结构体指针作为参数传递给线程线程的参数传递 在新线程中,可以从参数中取出对应的数据,代码如下:ULONG WINAPI SendFileThread(LPVOID p)myMeg*meg=(myMeg*)p;CString strIP=meg-ip;CString fileAddr=meg-fileAddr;本章
30、技能训练实例网络考试报名系统扩展 实验题目:多线程考试报名系统服务器的实现 实验目的:掌握多线程编程技术和文件操作技术 要求:服务器端采用多线程技术,在线程中使用循环接收客户的报名信息。简易聊天室授课教师:网络编程网络编程导入 在电子教室软件系统中,教师经常需要根据课程内容将学生分组,每个小组完成一个任务。每个小组的小组成员之间需要进行讨论,所以需要有一个简单的聊天室功能,使多个成员之间可以很方便的进行沟通和交流。本章我们就通过一个简单的聊天室程序,来介绍一下使用UDP协议进行通信的相关技术。本章要点 聊天室功能分析设计 WinSock实现UDP通信 CSocket类实现UDP通信 聊天室开发
31、 功能需求分析 聊天室服务器功能:启动一个新的聊天室。能记录所有登录的聊天者信息。能接收聊天者程序发来的聊天信息,并显示到界面上。能把一个聊天者发来的信息发送给所有其他聊天者。聊天者程序功能:能登录到聊天室服务器。能发送聊天信息给聊天室服务器。能接收服务器发回的其他人的聊天信息,并显示在自己的界面上。界面设计 关键技术分析 聊天室的核心功能就是多个点之间的数据传递 本章讲解另一种面向非连接的基于UDP协议的socket通信技术来实现聊天室实例 面向非连接的通信“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对
32、方手机号就可以了。UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。UDP通信流程图 核心程序实现 发送和接收的的数据包的定义 struct MEGint code;/包的编号char data500;/数据内容 Meg;code:数据包的编号 data:要传输的数据核心程序发送UDP数据包 void CSendUDPDlg:OnSend()UpdateData(true);struct MEG/发送数据对象的定义int code;/包的编码char data500;Meg;CSocket
33、 m_SendSocket;/构造一个套接字对象Meg.code=1;strcpy(Meg.data,m_message);/发送数据的初始化int port=8888;/对方的监听端口m_SendSocket.Create(6666,SOCK_DGRAM);/创建一个套接字句柄(UDP)m_SendSocket.SendTo(&Meg,sizeof(Meg),port,m_ip);m_SendSocket.Close();核心程序接收UDP数据包 void CReceiveUDPDlg:OnServer()struct MEGint code;/包的编码char data500;*pMeg;
34、CSocket m_ReceiveSocket;/构造一个套接字对象char*buff512;m_ReceiveSocket.Create(8888,SOCK_DGRAM);m_ReceiveSocket.Receive(buff,512);pMeg=(struct MEG*)buff;/非常关键m_show.AddString(pMeg-data);m_ReceiveSocket.Close();程序扩展实现点对点聊天 接收对方聊天信息功能流程 程序扩展实现聊天室 聊天室程序设计的思路是由一个服务器端程序和一个聊天者端程序组成。服务器端程序主要负责记录所有进入本聊天室的聊天者的IP地址,并且
35、接收所有聊天者的信息,将每个聊天者发来的信息转发给所有聊天者。聊天者程序可以发送聊天信息给服务器,同时可以接收服务器发送回来的信息,并显示到聊天记录界面上。聊天室服务器端程序主要功能:(1)记录所有进入本聊天室的聊天者IP(以便转发其他聊天者的聊天信息)。(2)启动一个子线程,用于接收聊天者数据包。(3)接到数据包,取出IP地址,存入聊天者列表(重复的不要)。(4)将接收到的聊天信息转发给聊天者列表中的每个聊天者。(5)将接收到的聊天信息添加到界面的列表控件中。聊天室服务器功能流程 聊天者程序功能:(1)进入聊天室,发送数据包给聊天室服务器。(2)接收服务器发送回来的信息,并显示到聊天记录界面
36、上。实现代码详见教材本章技能训练实例 题目一:将第一章的扫描可控计算机程序改为用UDP协议的通信技术实现。题目二:将前一章的网络考试报名系统改为基于UDP协议的通信技术实现。题目三:模仿群的模式,给你的几个好朋友建立一个共用的聊天群。可以几个人一起讨论需求和设计,在本章的简易聊天室程序基础上完善和开发,完成这个小应用软件,并在实际使用过程中测试它。网络会议室授课教师:网络编程网络编程导入 网络会议室与聊天室程序类似,其本质就是一种多点群发的的通信方式。在电子教室软件的实际应用过程中,经常需要组织分小组进行讨论,这时就需要建立几个组群,每个组内可以发起讨论,交流意见,这就是网络会议室应用程序。本
37、章的网络会议室功能虽与上一章的聊天室类似,但采用的是一种更好的实现方法IP多播技术。本章要点 网络会议室功能分析设计 IP广播技术 IP多播技术 功能需求分析 网络会议室需要有以下主要功能:用户可以选择参加某个会议 用户可以在会议上发表言论,并且用户的发言会即时传递给每个参加会议的人 用户可以随时看到参加会议的其他人的发言 用户可以随时选择退出会议。需要时,还可以再加入进来。界面设计 关键技术分析 根据参与一次通信的对象的多少,可将通信分为两大类:一类是点对点通信,也称其为单播通信,TCP协议仅支持这种单播通信方式 一类是多点通信,也称为群或组通信,UDP协议既支持单播通信方式,又支持多点通信
38、方式。本章研究内容是组通信广播通信 所谓广播是指一种同时与网络中所有主机进行交互数据的通信方式,传输者通过一次数据传输就可以使网络上的所有主机接收到这个数据信息。广播通信的主要用途是资源发现和减少网络数据流量。用于指示网络中所有主机的地址称为广播地址。广播地址有直接地址和有限地址之分。直接广播地址适合于向一个指定网络(已知网络号)发送数据包的情况,若不知道网络号,又要向本地网络发送广播数据包,就需要使用有限广播地址255.255.255.255。核心程序IP广播 一个IP广播程序分成两个部分,一个是广播端,一个是接收端。广播流程:广播端界面关键代码 设置套接字广播功能 setsockopt(S
39、endSocket,SOL_SOCKET,SO_BROADCAST,(char FAR*)&op,sizeof(op);设置有限广播地址 Addr.sin_addr.s_addr=inet_addr(255.255.255.255);代码详解Setsockopt()函数 setsockopt()函数用于任意类型、任意状态套接字的设置选项值,选项影响套接字的操作。int PASCAL FAR setsockopt(SOCKET s,int level,int optname,const char FAR*optval,int optlen);参数s:要设置的套接字对象。参数level:选项定义的
40、层次,如SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP等。参数optname:需设置的选项。参数optval:指针,指向存放选项值的缓冲区。参数optlen:optval缓冲区的长度。SOL_SOCKET级别对应的参数optname选项值如果是SO_BROADCAST,则代表允许套接字接收和发送广播消息接收广播信息端界面IP多播的网络会议室 多播是指一种同时与多台主机进行交互数据的通信方式,传输者通过一次传输就将数据信息传送给一组接收者。与广播不同的是多播只向事先规划好的多播组(由多台主机组成)发送数据,而不是向某个网络的所有主机发送数据。多播组是零个或多个使用同一IP目的
41、地址的主机集合,其成员在位置上和数量上均没有任何限制。多播不局限于局域网,也可用于广域网。多播地址 IP地址空间被划分为A、B、C三类。第四类即D类地址被保留用做多播地址。从224.0.0.0到239.255.255.255间的所有IP地址都属于D类地址 多播地址的范围是224.0.0.0239.255.255.255 IP多播的网络会议室 首先我们设计了三个网络会议室,它们的多播地址分别是“238.8.8.18”、“238.8.8.19”和“238.8.8.20”。用户可以选择进入哪个会议室(多播组)参与讨论。凡是多播组成员都可以向全组发送数据信息,且都可以看到本组成员发送的数据信息。每个成
42、员都可以随时离开这个多播组,也可以再次加入进来。程序界面 头文件和库文件#include#include#pragma comment(lib,ws2_32.lib)加入和退出多播组加入多播组代码:setsockopt(recvSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mq,sizeof(mq);退出多播组代码:setsockopt(recvSocket,IPPROTO_IP,IP_DROP_MEMBERSHIP,(char*)&mq,sizeof(mq);两条代码的差别在第三个参数上。当参数level的值是IPPROTO_IP时,对应的参数opt
43、name值为IP_ADD_MEMBERSHIP表示加入多播组,IP_DROP_MEMBERSHIP表示退出多播组。本章技能训练实例 局域网广播报时系统该程序分成两个部分,一个是发送时间数据程序,一个是接收时间程序。发送端程序取本机的系统时间,然后以广播通信的方式发送给本网络上的所有主机,接收端程序接收到广播的时间数据,并在界面上显示该时间。查询本地计算机配置授课教师:网络编程网络编程导入 内联网经常用在企业的局域网并使用分布式的应用程序,而分布式的应用程序宿主是本地计算机,如何正确地获得本地计算机的网络协议及配置信息,对于更深入地编写网络应用程序是一件很重要的事。本章要点 获取主机名和IP地址
44、 读取注册表 查询本机网卡地址 查询本机子网掩码 查询本机网关 查询本机DNS设置功能需求分析 开发一个简单的查询工具,可以查询本机的基本软硬件配置,本机的基本网络配置,包括:计算机名 IP地址 操作系统 CPU 网卡地址 子网掩码 DNS服务器 网关界面设计获取主机名和IP地址 程序运行界面获取本机计算机名源代码 WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);char HostName128;BOOL bRet;bRet=gethostname(HostName,128);if(bRet!=0)MessageBox(获取计算机名错误!,
45、提示);return;CString strMeg=HostName;strMeg=本机的计算机名是:+strMeg;m_show.InsertString(-1,strMeg);WSACleanup();获取本机IP地址的源代码 WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);char HostName128;struct hostent*pHost;gethostname(HostName,128);pHost=gethostbyname(HostName);int i=0;CString strIP;while(pHost-h_add
46、r_listi!=NULL)strIP=inet_ntoa(*(struct in_addr*)pHost-h_addr_listi);CString str=本机的IP地址:+strIP;m_show.InsertString(-1,str);i+;WSACleanup();代码详解gethostname函数 该函数可以获取本地主机名,若无错误,返回0;否则,返回SOCKET_ERROR。gethostname(char*name,int namelen);参数name:用于指向所获取本地主机名的缓冲区地址。参数namelen:缓冲区的大小,以字节示。代码详解gethostbyname函数
47、该函数可以从主机名数据库中得到对应的“主机”(由名字和地址标识)。若无错误,函数返回一个指向hostent结构的指针,它可标识一个“主机”列表。struct hostent*FAR gethostbyname(const char*name);参数name:是主机名。读注册表 获取本机的操作系统信息和CPU信息需要查询注册表,从注册表中读出所需要的信息,然后显示到界面上。什么是注册表?注册表是Windows程序员建造的一个复杂的信息数据库,它是多层次式的。注册表由键(或称“项”)、子键(子项)和值项构成。一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。一个值项
48、则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。查看注册表“开始”“运行”中输入regedit命令,然后回车,会弹出注册表编辑器界面 操作注册表的流程 操作注册表 使用CRegKey类 CRegKey类提供的几个重要函数:Open函数打开注册表 QueryValue函数读注册表 SetValue函数写注册表 Close函数关闭注册表代码详解Open函数 打开注册表中的主键。若成功,返回ERROR_SUCCESS,失败则返回错误值。LONG Open(HKEY hKeyParent,LPCTSTR
49、 lpszKeyName,REGSAM samDesired=KEY_ALL_ACCESS);参数hKeyParent:需打开的键的句柄。参数lpszKeyName:需打开的键所在的注册表的路径。参数samDesired:注册表访问的权限,默认值为KEY_ALL_ACCESS。代码详解QueryValue函数 读取注册表中键值项的键值,若成功,返回ERROR_SUCCESS,失败则返回错误值。LONG QueryValue(DWORD&dwValue,LPCTSTR lpszValueName);参数dwValue:DWORD数据类型的键值。参数lpszValueName:所读取键值项的名称。
50、LONG QueryValue(LPTSTR szValue,LPCTSTR lpszValueName,DWORD*pdwCount);参数szValue:字符串数据类型的键值。参数lpszValueName:所读取键值项的名称。参数pdwCount:字符串的长度。代码详解 SetValue函数 LONG SetValue(DWORD dwValue,LPCTSTR lpszValueName);参数dwValue:需要写入的DWORD类型键值。参数lpszValueName:所写入的键值项名称,如果不存在,则增加一个新的键值项。LONG SetValue(LPCTSTR lpszValue