利用Winsock进行IP通信编程

1 关于WinSock

Windows Sockets (即Winsock)是在Windows上进行网络通信编程的API接口,也是Windows网络编程的事实标准。Winsock建立在Berkeley套接口之上, 包括了大量的Unix环境下开发的Berkeley函数,提供了习惯于Unix套接口编程的程序员极为熟悉的环境,并且简化了移植现有的基于套接口的应用程序源代码的工作。另外,Winsock还包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。Winsock有开发组件和运行组件两大部分,开发组件是供开发应用程序使用,而运行组件是Winsock应用程序接口的动态连接库一一Winsock.DIl, 应用程序在执行时通过装入DLL实现网络通信功能。

由于Windows的基于消息的特点,Winsock和BSD套接口相比,有如下一些新的扩充:异步选择机制、异步请求函数、阻塞处理方法、错误处理、启动和终止。在Unix中I/O是同步的,所以Berkeley Sockets没有任何异步函数, 可是Windows是一种异步操作系统, 异步选择函数WSAAsyncSelect()的使用是实现Windows网络实时通信的关键。

Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。应用程序调用Windows Sockets的API实现相互之间的通信。Windows Sockets又利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。它们之间的关系如图1。

在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读、写操作。现在,Socket接口已经成为TCP/IP网络最为通用的API,也是在Internet上进行应用开发最为通用的API。

 

2 因特网的网间通信

因特网的互连体系结构可以称作是无连结型网络层同构互连的典范。现在,我们来简单了解一下因特网的网间通信。我们知道,好的网络互连体系结构应该能实现简单而有效的网间通信过程。当两个端系统进行通信时,传输层将来自应用系统的用户数据流分段递交给网际互连层一一IP层。

IP层完成的主要任务就是:实现在“超级的”互连网上对无连结数据报的传输、数据报寻径以及差错与故障的处理。实现数据报传输功能的核心就是网际协议IP,而网间控制报文协议ICMP是完成IP层主要控制功能的辅助协议。能够提供差错控制与报告、拥塞控制和路径控制以及故障诊断。IP层实体将数据段分割成更小的数据单元并封装成IP数据报,IP数据报在由端系统和路由器构成的虚拟网上传输,到达目的端系统后再由IP层实体对它们进行排序、卸包和组装,恢复成原来的数据段递交给目的传输层,传输层把所有数据段重装恢复成原来的用户数据流后递交给目的应用系统。虚拟网上的路径选择服从于“间接路由”协议机制,各个子网内的真实传输过程的路径选择则服从于该子网内的“直接路由”协议机制。这里就涉及到了IP路由技术。

在数据报的传输过程中,每个路由器和端系统都有路由表,但并不指导整个路由,其中仅仅定义了从某个路由器到宿端的下一个路由器的路径。路由表中记入的路由信息则是通过路由之间、根据具体的路由算法和路由协议来互相交换控制信息而得到的。具体IP路由过程为:IP实体先将从某个接口上接收到的IP数据报的目的IP地址与本地地址比较,决定转发还是接受,如果确定转发,则IP协议实体从数据报的目的IP地址中抽出目的网络号,然后在路由表中找到对应这个网络号的表项,即可确定直接还是间接路由、网络接口号、下一个路由器IP地址(若为间接路由)。假如表中没有对应的网络号,则启用缺省网络号的表项中的路由地址来转发此数据报。

 

3 WinSock通信编程

(1)Socket编程原理

Windows Sockets规范是建立在Bekeley套接口模型上的。这个模型现在已是TCP/IP网络的标准。套接口有三种类型:流式套接口,数据报套接口及原始套接口.流式套接口定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输;数据报套接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错;原始套接口允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用,面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能鳃决的,而且往往是并发服务器。套接口工作过程如下:服务器首先启动,通过调用socket()建立一个套接口,然后调bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接,客户在建立套接口后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据,最后,待数据传送结束后,双方调用close()关闭套接口。

在网络编程中最常用的方案便是客户机/服务器模型。基于连接协议(流套接字)的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过无连接协议(数据报套接字)提供的。般在使用中,面向连接协议的Socket编程模型应用最为广泛,因为面向连接协议提供了一系列的

数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方。

 

(2)基于Winsock的应用开发介绍

Winsock是一组用C语言写的API,用于通过Internet进行数据传输。通过Winsock编程可以获得更大的灵活性。可是,Socket提供的原语数目很多,接口参数复杂,对一般用户尤其非网络专业用户,直接调用Soc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值