版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第22章 Windows Socket API编程,随着Windows操作系统的普及,Microsoft公司联合其他计算机软硬件厂商共同开发了Windows下的网络编程接口Windows Socket API。Windows Sockets规范定义了一个在TCPP/IP网络上可作为标准使用的应用编程接口,由于它支持多种协议体制下的网络通信,支持多种编程语言,而且在许多操作系统上具有广泛的适用性,所以为网络开发人员提供了方便。本章将介绍Visual C+环境下怎样使用Windows Socket API进行网络编程。,22.1 Windows Sockets概述,Windows Sockets规
2、范的套接口模型现在已是TCP/IP网络标准。作为一个开放的、支持多种协议的网络编程接口在Windows下得到广泛的应用,已成为Windows网络编程事实上的标准。使用这种规范,用户可以方便地实现异构网络操作系统之间的通信。,22.1.1 Windows Sockets的发展,上世纪80年代初期,美国政府的高级研究工程机构(Advanced Research Projects Agency,ARPA)给加利福尼亚大学Berkeley分校提供了资金,让他们在UNIX操作系统下实现TCP/IP协议。作为项目的一部分,研究人员为TCP/IP网络开发了一个应用程序接口,这个应用程序接口称为Socket接
3、口。现在,Socket接口已经成为TCP/IP网络最为通用的API,已经成为事实上的标准。,22.1.2 Windows Sockets的类型,在Windows网络编程中,套接字接口主要有三种类型:流式套接字、数据报套接字以及原始套接字。 1流式套接字(stream socket) 2数据报套接字(datagram socket) 3原始套接字(raw socket),22.1.3 Windows Sockets扩展,Windows Sockets提供了许多在标准的Berkeley Sockets之外的扩展函数。使用这些扩展的函数应用程序能更好地处理基于消息的异步发送的网络事件。主要有以下几个
4、方面。 1异步选择机制 2异步请求函数 3阻塞处理方法 4出错处理 5启动与终止,22.1.4 套接字编程模型,在网络编程中最常用的方案便是客户机/服务器模型。在模型中客户应用程序向服务器程序请求服务,一个服务程序通常在一个固定的地址监听对服务的请求,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程对客户的请求作出适当的反应,为客户提供服务。,22.2 Windows Socket API主要函数,Windows Sockets提供了许多套接字函数,用户利用这些函数可以很容易地进行编程。本节将对常用的一些套接字函数,及利用这些函数进行网络编程的步骤进行详细讲解。,22.2.1 初
5、始化WinSock,每个WinSock应用都必须加载WinSock DLL的相应版本,加载WinSock库是通过调用WSAStartup()函数实现的。WSAStartup()对进程初始化WS2_32.DLL的使用。其原型如下: int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );,22.2.2 创建套接字,socket()函数的功能是创建套接字。应用程序在使用套接字前,首先必须创建一个套接字,应用程序调用socket()函数来创建套接字。该函数的原型如下: SOCKET socket(int af, int type,
6、int protocol);,22.2.3 绑定地址,在定义一个套接字后,需要为其指定本机地址、协议和端口号。bind()函数用于将套接字绑定到一个已知的地址上。该函数的原型如下: int bind(SOCKET s, const struct sockaddr FAR * name, int namelen);,22.2.4 将套接字设置为监听状态,当服务器端的Socket对象绑定之后,必须建立一个监听的队列来接收客户端的连接请求。调用listen()函数使服务器端的Socket进入监听状态,并设定可以建立的最大连接数,目前连接数最大值限制为5,最小值为1。该函数的原型如下: int lis
7、ten( SOCKET s, int backlog );,22.2.5 发送连接请求,connect()函数用于发送一个连接请求。该函数的原型如下: int connect (SOCKET s,const struct sockaddr FAR* name, int namelen);,22.2.6 接受连接请求,当客户端提出连接请求时,服务器端要调用要accept()函数接受客户端的连接请求。accept()函数的原型如下: SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );,2
8、2.2.7 发送数据,不论是客户还是服务器应用程序都用send()函数来向TCP连接的另一端发送数据。客户程序一般用send()函数向服务器发送请求,而服务器则通常用send()函数来向客户程序发送应答。send()函数的原型如下: int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags );,22.2.8 接收数据,不论是客户还是服务器应用程序都用recv()函数从TCP连接的另一端接收数据。该函数的原型如下: int PASCAL FAR recv( SOCKET s, char FAR *buf, int
9、 len, int flags );,22.2.9 关闭套接字,应用程序在使用完套接字以后,需要将其关闭,并释放其相关资源。Closesocket()函数用于关闭一个描述符为s套接字,并释放分配给该套接字的资源。如果s涉及一个正在进行的连接,则该连接被释放。该函数的原型如下: BOOL closesocket(SOCKET s);,22.2.10 关闭加载的套接字库,应用程序在使用完Socket库后,要调用WSACleanup()函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。该函数的原型如下: int WSACleanup(void);,22.2.11 确定套接字状态
10、,select()函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。22.3 Windows Socket API编程步骤 读者了解了Windows Socket API相关的概念及函数之后,本节将通过一个简单的客户端/服务器例子来说明如何使用Windows Socket API进行网络编程。,22.3.1 引入所需文件,WinSock包括开发组件和运行组件两大部分,开发组件包括WinSock实现文档、应用程序接口(API)引入库和一些头文件。运行组件包括WinSock应用程序接口的动态连接库。以WinSock V2.0为例,在Visual C+
11、 6.0中使用WinSock编程时,需要将以下三个文件包含到项目中。 头文件:Winsock2.h; 库文件:WS2_32.LIB; 动态库:WS2_32.DLL。,22.3.2 服务器端编程,通常情况下在TCP/IP网络中,通信的两个进程之间通常使用客户机/服务器模式。服务器端编程通常遵循以下步骤。 (1)加载套接字库,创建套接字(WSAStartup()/socket())。 (2)绑定套接字到一个IP地址和一个端口上(bind())。 (3)将套接字设置为监听模式等待连接请求(listen())。 (4)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept())。
12、(5)用返回的套接字和客户端进行通信(send()/recv())。 (6)返回,等待另一连接请求。 (7)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。,22.3.3 客户端编程,通常客户端遵循以下编程步骤。 (1)加载套接字库,创建套接字(WSAStartup()/socket())。 (2)向服务器发出连接请求(connect())。 (3)和服务器端进行通信(send()/recv())。 (4)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。,22.4 基于WinSock的简单聊天室的实现,本节将通过一
13、个聊天室的实例,使读者加深对Windows Sockets编程的认识。本实例使用面向连接的客户端/服务器模式。,22.4.1 系统总体设计,整个系统分为服务器和客户端两部分。服务器的界面如图22.4所示,客户端的界面如图22.5所示。服务器对话框中主要控件如表22.10所示,客户端对话框中主要控件如表22.11所示。,22.4.2 创建服务器端工程,下面列出的是创建服务器端应用程序的具体步骤。,22.4.3 添加服务器端代码,创建完服务器端工程后,在工程中添加相应代码。首先在服务器窗口类CWinSockServerDlg中添加以下变量。,22.4.4 服务器线程,服务器端最重要的函数是服务器线
14、程函数,使用此函数可以接收多个客户端连接,还负责接收客户端发送的数据,并将接收的数据发送到其它客户端。,22.4.5 创建客户端工程,客户端负责发送用户聊天数据,并接收服务器发送过来的其它客户端的数据。创建客户端工程的步骤与创建服务器工程相同,只需将工程名称改为WinSockClient,具体步骤就不再赘述。创建完工程后,在工程中添加相应的控件及事件,有关客户端相关控件参见表22.11。添加完控件后便可以编写具体的代码了。,22.4.6 添加客户端代码,创建完客户端工程后,在工程中添加相应代码。首先在客户端窗口类CWinSockServerDlg中添加以下变量。,22.4.7 客户端线程,服务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 耳穴压豆 · 中医护理技术培训
- 2025年北京市昌平区初二(上)期中试卷语文(含参考答案)
- 《洗涤与化妆品》课件
- 不锈钢水箱的安装方法和维护保养
- 函数单调性习题
- 安藤忠雄及其设计介绍城户崎住宅
- app推广报告及方案
- 2026年烟草案件证据固定取证考核题库及答案
- 2026年数据挖掘工程师社会招聘综合笔试试卷及答案
- 2026年农机安全生产隐患排查培训试卷及答案
- 2026年餐饮企业食材检测合同协议
- 光学显微镜安装确认、运行确认和性能确认3Q验证方案
- 北京市东城区2026年高一下生物期末达标测试试题含解析
- 国家层面“十五五”产业规划与布局:产业研究专题系列报告之一规划篇
- 建筑工程设计规范
- 《甲醇燃料发电机组技术条件和试验方法》征求意见稿
- 能源管理体系培训课件教学
- 元器件焊接技术
- 2025年黎明职业大学辅导员考试笔试题库附答案
- TJSTJXH5-2022高延性混凝土加固技术规程
- 医疗康复科操作礼仪要点
评论
0/150
提交评论