Winsock网络编程接口

本文详细介绍了Winsock网络编程接口,包括Winsock编程原理、简单客户机/服务器、Winsock的启动和终止、错误的检查和控制以及Winsock编程模型。Winsock是Windows下的网络编程接口,提供流套接字和数据报套接字服务,支持TCP/IP协议。文章通过流套接字的编程模型阐述了如何实现客户机/服务器通信,包括创建套接字、绑定、监听、接受连接和数据传输等步骤。
摘要由CSDN通过智能技术生成

       Winsock 是一套开放的、支持多种协议的 Windows 下网络编程接口,是 Windows 网络编程上的标准接口。应用程序通过调用 Winsock 的 API 实现相互之间的通信,而 Winsock利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。
       套接字(Sockets)是通信端点的一种抽象,是支持 TCP/IP  协议网络通信的基本操作单元,它提供了一种发送和接收数据的机制。在开发服务器/客户端应用程序时,可以利用Sockets 实现数据结构或数据包的交换,以完成应用程序之间的通信。
       套接字一般有两种类型:流套接字和数据报套接字。
       流套接字提供双向的、有序的、无重复并且无记录边界的数据流服务,它适用于处理大量数据。流套接字是面向连接的,通信双方进行数据交换之前,必须建立一条路径,类似于打电话,首先要双方能连接,才能继续通话。这样既确定了它们之间存在的路由,又保证了双方都是活动的、可彼此响应的。在数据传输过程中,如果连接断开,则应用程序会被通知,此时应用程序可以根据中断原因作相应处理,在实际中,由于其可靠性高,流式 Sockets  得到了广泛应用。但在通信双方之间建立一个通信信道需要很多开支。除此以外,大部分面向连接的协议为保证发送无误,可能会需要执行额外的计算来验证正确性,因此会进一步增加开支。
       数据报套接字支持双向的数据流,但并不保证数据传输的可行性、有序性和无重复性。也就是说,一个从数据报套接字接收信息的进程有可能被发现信息重复,或者和发出时的顺序不同的情况。此外,数据报套接字的一个重要特点是它保留了记录边界。数据报套接字是无连接的,它不保证接收端是否正在侦听,类似于邮政服务:发信人把信装入邮箱即可,至于收信人是否能收到这封信或邮局是否会因为暴风雨未能按时将信件投递到收信人处等,发信人都不得而知。因此,数据报并不十分可靠,需要程序员负责管理数据报的排序和可靠性。应用程序具体可以采用的技术有:通过加流水号方式实现数据包的不丢失传输,通过对数据包校验实现正确传输,当出现传输错误时采用重发技术。当然读者可以采用自己的独特方法来保证数据的稳定可靠传输。数据包的一个优点是:它提供了向多个目标地址发送广播数据包的功能。

 Winsock 编程原理

1.  简单客户机/服务器

       进入 20 世纪 90 年代以后,随着计算机和网络技术的发展,很多数据处理系统都采用开放系统结构的客户机/服务器(Client/Server)网络模型,即客户机向服务器提出请求,服务器对请求做相应的处理并执行被请求的任务,然后将结果返回给客户机。

       客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受),这一套惯例包含一套协议,它必须在通信的两端都被实现。根据不
同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色,如 Internet 协议中的 Telnet 协议;在非对称协议中,一方不可改变地被认为是主机,而另一方是从机,如 Internet 中的 Http 协议。无论具体的协议是对称的还是非对称的,当服务被提供时必须存在客户进程和服务进程。
       一个服务程序通常在一个众所周知的地址监听客户对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务——对客户的请求作出适当的反应。

 2.Winsock 的启动和终止

       由于 Winsock  的服务是以动态链接库 Winsock  DLL  形式实现的,所以必须先调用WSAStartup 函数对 Winsock  DLL 进行初始化,协商 Winsock 的版本支持,并分配必要的资源。如果在调用 Winsock 函数之前,没有加载 Winsock 库,则会返回 SOCKET_ERROR错误,错误的信息是 WSANOTINITIALIZED。WSAStartup 函数原型为:
 
                          int  WSAStartup(WORD  wVersionRequested,LPWSADATA lpWSAData);
 
       其中,参数 wVersionRequested 指定应用要使用的 Windows Sockets 最高版本,其中高位字节表示辅版本号,低位字节表示主版本号。目前使用最广泛的是 Windows Sockets 1.1版本,最高版本已经是 2.0 版本。一般用宏 MAKEWORD(X,Y)获得 wVersionRequested 的正确值。如 MAKEWORD(2,0)表示使用 Windows Sockets2.0  版本。
      参数 lpWSAData 指向 WSADATA 结构的指针。该结构包含了加载的库版本的有关的信息。
      该函数成功则返回 0,失败则返回如下可能值。 
      (1) WSASYSNOTREADY:表示网络设备没有准备好。
      (2) WSAVERNOTSUPPORTED:Winsock 的版本信息号不支持。
      (3) WSAEINPROGRESS:一个阻塞式的 Winsock1.1 存在于进程中。
      (4) WSAEPROCLIM:已经达到 Winsock 使用量的上限。
      (5) WSAEFAULT:lpWSAData 不是一个有效的指针。
      此外,在应用程序关闭套接字后,还应调用 WSACleanup 函数终止对 Winsock DLL 的使用,并释放资源,以备下一次使用。WSACleanup 函数的原型为:
 
                         int  WSACleanup(void);

      该函数不带任何参数,若调用成功则返回 0,否则返回错误。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值