《VisualC网络编程技术课件》由会员分享,可在线阅读,更多相关《VisualC网络编程技术课件(31页珍藏版)》请在金锄头文库上搜索。
1、,扫描可控计算机,授课教师:,网络编程,导入,电子教室软件主要功能是教师可以通过教师机程序控制和管理学生机 教师机端控制程序能够主动扫描学生机,确定哪些学生已经进入电子教室,是可控计算机 本章通过简单的通信程序实现扫描局域网内可控计算机的功能,本章要点,扫描可控计算机功能实现分析 WinSock通信编程技术 MFC网络通信编程技术,扫描可控计算机功能需求分析,教师机主动联系学生机,如果不能与学生机建立联系,则说明学生机端没有运行该程序,该学生机不在可控范围;反之,如果教师机与学生机成功的取得了联系,则证明学生机已启动程序,处于可控状态。 教师机扫描学生机时,应该可以设置扫描范围,例如一个IP地
2、址范围,教师机与范围内的所有学生机逐一联系,判断其是否处于可控状态,将处于可控状态的学生机显示在教师机端的程序界面上。,设计程序界面,关键技术分析,关键技术就是两台联网的计算机之间进行通信 采用什么技术实现网络通信? 套接字(Socket),WinSock进行面向连接通信编程,WinSock实现基于TCP的客户端/服务器通信,程序演示 程序源代码(见教材P18),程序代码详解头文件和库文件,#include #pragma comment(lib,ws2_32.lib) 使用WinSock进行编程开发,需要头文件和库文件ws2_32.lib的支持。,程序代码详解 WSADATA,WSADATA
3、 wsaData; if(ret=WSAStartup(MAKEWORD(2,2),程序代码详解 socket,调用Socket()函数可以建立套接字 函数原型:SOCKET socket( int af, int type, int protocol ) 参数af:套接字要使用的协议地址族,目前只提供AF_INET表示使用互联网协议(IP)地址。 参数type:描述套接字的类型,只能是SOCK_STREAM、SOCK_DGRAM、SOCK_RAW 中的一个。 参数protocol:该套接字使用的特定通信协定(如果使用者不指定则设为0)。,程序代码详解bind,调用bind()函数为服务器端定
4、义的监听套接字指定一个地址及监听端口(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:已绑定但尚未连接的套接字句柄,也是由socket()函数创建的套接字句柄。 参数backlog:待处理
5、的连接队列的最大长度。当连接的客户数大于这个最大长度并且服,程序代码详解accept,accept函数在服务器端等待并接受客户的连接,该函数返回一个新的套接字,该套接字可以用来与对方进行通信,而原先的套接字还是处于监听状态。 int accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen); 参数s:表示处于监听模式的套接字句柄。 参数addr:是SOCKADDR对象的地址。 参数addrlen:表示addr参数的长度。,程序代码详解send,send函数发送数据 int send( SOCKET s, const char F
6、AR *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, MSG_PEEK
7、, 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继
8、承而来,继承了它封装的WinSock API,CSocket类实现网络通信编程过程,构造一个CSocket对象。 使用这个对象的Create()成员函数产生一个socket对象。在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方程序,必须在调用Create时指定一个端口。 如果是客户方套接字,则调用Connect()函数与服务方套接字连接;如果是服务方套接字,则调用Listen()开始监听来自客户方的连接请求,收到连接请求后,调用Accept()函数接受请求,建立连接。 连接成功建立后,可以使用Receive()和Send()函数进行数据发送和接
9、收工作。 通信结束后,使用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 lpszSocketAddr
10、ess = NULL); 参数nSocketPort:与套接字一起使用的端口号,默认值为0,表示自动选择端口号。 参数nSocketType:指定要创建的套接字类型,默认为流式套接字。 参数lEvent:指定感兴趣的网络事件的掩码位。 参数lpszSocketAddress:指定套接字的网络地址。,代码详解 Listen函数,BOOL Listen(int nConnectionBacklog = 5); 参数nConnectionBacklog:指定连接请求队列的最大连接数目,默认为5。,代码详解Accept函数,virtual BOOL Accept (CAsyncSocket 参数rCo
11、nnectedSocket:用来进行连接的新套接字的引用。 参数lpSlpSockAddr:用来返回发送连接请求的套接字地址的SOCKADDR结构指针。 参数lpSockAddrLen:指向pSockAddr结构中地址的字节长度的指针。,代码详解 Connect函数,BOOL Connect (LPCTSTR lpszHostAddress, UINT nHostPort); 参数lpszHostAddress:用于要连接的服务器网络地址。 参数nHostPort:指定套接字应用程序使用的端口号。,代码详解Receive函数,virtual int Receive(void* lpBuf, i
12、nt 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描述符,其函数原型为: Virtual void Close ( ) ;,扩展核心程序,首先建立两个应用程序,一个teacher和一个student。 student程序应首先启动,teacher程序能够主动向所有student程序发出连接请求 能够成功建立连接的学生机就是可控学生机,把其IP地址显示在teacher程序界面上。,本章技能训练实例,实验题目:简单的考试报名系统实现 实验目的:掌握使用Socket进行通信的基本方法和简单控件编程 实验内容:开发一个服务器端程序,能够接收客户端发来的信息;开发一个客户端程序,能够将信息发送给服务器端,可采用CSocket编程,也可以用WinSock编程。,Thank You !,