Winsock API 选项配置_第1页
Winsock API 选项配置_第2页
Winsock API 选项配置_第3页
Winsock API 选项配置_第4页
Winsock API 选项配置_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Winsock API 选项配置摘要介绍了insk下的网络编程API函数的网络参数以及一些根本的环境配置。同时也可以理解到一些根本的网络特性,给出了网络配置的根本形式,从而更好地对网络通讯进展有效地配置管理。在面对大量烦琐的网络函数与参数的同时,总结出了一些配置它们的方法。关键词套接字;insk;地址族;协议族;为了方便网络编程,20世纪90年代初,由irsft结合了其他几家公司共同制定了一套inds下的网络编程接口,即indsSkets标准,它不是一种网络协议,而是一套开放的、支持多种协议的inds下的网络编程接口。如今的insk已经根本上实现了与协议无关,可以使用insk来调用多种协议的功

2、能,但较常使用的是TP/IP协议。Sket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Sket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Sket接口来实现。通讯的基石是套接字,一个套接字是通讯的一端。在这一端上可以找到与其对应的一个地址名。一个正在被使用的套接字都有它的类型和与其相关的进程。套接字存在于通讯域中。通讯域可以是抽象的概念,它是套接字的一套完备的系列,最后可以通过程序来实现。套接字通常和同一个域中的套接字交换数据。indsSkets标准支持单一的通讯域,即Internet域。套接字可以根据通讯性质分类,程序员可以根据详细的情况进展设置。一般我们

3、仅在同一类的套接字间通讯。可以通过配置底层文件,让不同类型的套接字间也照样可以通讯。目前sket提供可以使用两种套接字类型,即流套接字(TP)和数据报套接字(UDP)。流套接字提供了双向的,有序的,无重复并且无记录边界的数据流效劳。他在数据传输当中保证数据的完好性和可靠性等。数据报即UDP套接字支持双向的数据流,但并不保证是可靠,有序,无重复。indsSkets标准支持的套接字属性选项都可以在对setskpt()函数和getskpt()函数的配置中实现。任何关于Skets实现必须可以识别所有这些属性选项,并且对每一个属性选项都返回合理的数值。intsetskpt(SKETs,intlevel,

4、intptnae,nsthar*ptval,intptlen);一般来讲,我们可以手动地对sket进展配置,但是在大多数情况下,sket的默认配置可以解决绝大多数的网络问题,只有我们需要一些特殊的用处时才会用到它。让套接字工作,其过程如下:效劳器首先启动,通过调用sket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联络在一起,再调用listen()使套接字做好侦听的准备,并规定它的恳求队列的长度(这个长度通常有最大的限制),之后就调用aept()来接收连接.客户在建立套接字后就可调用nnet()和效劳器建立连接.一旦建立连接,客户机和效劳器之间就可以通过调用read()和r

5、ite()来发送和接收数据。数据收发完毕之后,调用lse()关闭套接字。3.1sket()intsket(intdain,inttype,intprtl);参数dain指定套接字使用的协议族,AF_INET表示使用TP/IP协议族,AF_UNIX表示使用Unix协议族,AF_IS表示套接字使用IS协议族,一般只要使用TP/IP就可以了。type指定套接字类型,一般的面向连接通信类型(如TP)设置为SK_STREA,当套接字为数据报类型时,type应设置为SK_DGRA,假如是可以直接访问IP协议的原始套接字那么type应设置为SK_RA。参数prtl一般设置为0,表示使用默认协议。当sket(

6、)函数成功执行时,返回一个对这个套接字的描绘符,假如出错那么返回-1,并设置errn为相应的错误类型。在通常情况下,首先要将描绘效劳器信息的套接字地址构造清零,这个地址构造将常用的地址信息储存在一个构造里面以供调用,我们可以直接在地址构造中填入相应的内容,准备承受客户机送来的连接建立恳求。insk定义了一种通用的套接字地址构造:strutskaddrunsignedshrtsa_faily;/*addresstype*/harsa_data14;/*prtladdress*/其中sa_faily意指套接字使用的协议族地址类型,对于一般的TP/IP网络,其值应该是AF_INET,sa_data是

7、存储地址协议信息的数组,不同的协议族有不同的地址,但是都可以存在这个通用的构造体里面,通常的做法是将不同的协议转换成一样的协议地址,然后再进展通讯。用于TP/IP协议族的套接字地址构造是skaddr_in,其定义为:strutskaddr_inshrtsin_faily;unsignedshrtsin_prt;IN_ADDRsin_addr;harsin_zer8;其中sin_zer成员并未使用,它是为了和通用套接字地址strutskaddr兼容性而设定的。在编程中,一般都通过bzer()或是eset()将其置零。servaddr.sin_faily=AF_INET;表示套接字使用TP/IP协

8、议族。servaddr.sin_addr.s_addr=htnl(INADDR_ANY);设置效劳器套接字的IP地址为特殊值INADDR_ANY,表示效劳器愿意接收来自任何网络设备接口的客户机连接。htnl()函数将主机顺序的字节转换成网络顺序的字节。servaddr.sin_prt=htns(PRT);设置通信端口号,PRT即用于通讯的端口号。3.2bind()将一本地地址与一套接字捆绑。intbind(SKETs,nststrutskaddr*nae,intnaelen);s:未绑定的套接字。nae:套接字地址。skaddr构造定义如下:strutskaddru_shrtsa_faily;

9、harsa_data14;naelen:nae名字的长度。本函数适用于未连接的数据报或流类套接字,在listen()调用前使用。当用sket()创立套接字后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接字分配一个本地名字来为套接字建立本地捆绑。假如端口号置为0,那么insk将给应用程序分配一个值在1024到5000之间的端口号。应用程序可在bind()后用getsknae()来获知所分配的地址,但getsknae()只有在套接字连接成功后才会正确的得到分配的地址。3.3listen()intlisten(intskfd,intbaklg);参数skfd指

10、定要求转换的套接字描绘符,参数baklg设置恳求队列的最大长度。函数listen()主要完成以下操作:首先是将套接字转换成监听套接字。客户机可以通过调用函数nnet()来使用这样的套接字主动和效劳器建立连接。而listen()可将一个效劳端尚未连接的主动套接字转换成为这样的被动套接字,也就是监听套接字。在执行了listen()函数之后,效劳器的TP就由LSED变成LISTEN状态了。另外listen()可以设置连接恳求队列的最大长度。TP协议为每个倾听套接字实际上维护两个队列,一个是未完成连接队列,这个队列中的成员都是未完成3次握手的连接;另一个是完成连接队列,这个队列中的成员都是虽然已经完成

11、了3次握手,但是它是还未被效劳器调用aept()接收的连接。参数baklg指定的是这个倾听套接字完成连接队列的最大长度。3.4aept()intaept(intskfd,strutskaddr*addr,int*addrlen);参数skfd是转换成功并且得到的倾听套接字;参数addr是一个指向套接字地址构造的指针,参数addrlen为一个整型指针。当函数成功执行时,返回3个结果,函数返回一个新的套接字,即接收套接字,效劳器可以通过这个新的套接字描绘符和客户机进展通信。参数addr所指向的套接字地址构造中将存放客户机的相关信息,addrlen指针将描绘前述套接字地址构造的长度。在通常情况下程序

12、效劳端对后面两个参数信息不是很感兴趣,我们可以忽略他们,因此通常我们将aept()函数的后两个参数都设置为NULL。3.5nnet()intnnet(intskfd,strutskaddr*servaddr,intaddrlen);参数skfd是调用函数sket()返回的套接字描绘符,参数servaddr指向远程效劳器的套接字地址构造,参数addrlen指定这个套接字地址构造的长度。函数nnet()执行成功时返回0,假如执行失败那么返回-1,并将全局变量errn设置为相应的错误类型。4.1send()intPASALFARsend(SKETs,nstharFAR*buf,intlen,intf

13、lags);s:一个用于标识已连接套接字的描绘字。buf:包含待发送数据的缓冲区。len:缓冲区中数据的长度。flags:调用执行方式。前面已经在sket的根底上建立起了一个完好的套接字,如今将在这个套接字上发送数据。第二个参数buf,那么是字符缓冲区,区内包含即将发送的数据。第三个参数len,指定即将发送的缓冲区内的字符数。最后,flags可为0、SG_DNTRUTE或SG_B。另外,flags还可以是对那些标志进展按位“或运算的一个结果。SG_DNTRUTE标志要求传送层不要将它发出的包路由出去。由基层的传送决定是否实现这一恳求(例如,假设传送协议不支持该选项,这一恳求就会被忽略)。SG_

14、B标志预示数据应该被带外发送。对返回数据而言,send返回发送的字节数,通常可以得到这些数据进展处理。假设发生错误,就返回SKET_ERRR。常见的错误是SAENNABRTED,这一错误一般发生在虚拟回路由于超时或协议有错而中断的时候。发生这种情况时,应该关闭这个套接字,因为他已经无效了。远程主机上的应用通过执行强行关闭或意外中断操作重新设置虚拟回路时,或远程主机重新启动时,发生的那么是SAENNRESET错误。发生这一错误时,也应该关闭这个套接字。最后一个常见错误是SAETIEUT,它发生在连接由于网络故障或远程连接系统异常死机而引起的连接中断时。4.2rev()Intrev(SKETS;h

15、arFAR*buf;intlen;intflags;);第一个参数s,是准备接收数据的套接字描绘符。第二个参数buf,是即将收到数据的字符缓冲,而len那么是准备接收的字节数或buf缓冲的长度。最后,flags参数可以是下面的值:0、SG_PEEK或SG_B。0表示无特殊行为。SG_PEEK会使有用的数据复制到所提供的接收端缓冲内,但是没有从系统缓冲中将它删除。另外,还返回了待发字节数。消息取数不太好。不仅导致性能下降(因为需要进展两次系统调用,一次是取数,另一次是无SG_PEEK标志的真正删除数据的调用),在某些情况下还可能不可靠。返回的数据可能没有反射出真正有用的数量。与此同时,把数据留在

16、系统缓冲,可包容接入数据的系统空间就会很少。其结果便是,系统减少各发送端的TP窗口容量。因此就不能获得最大的流通。最好是把所有数据都复制到自己的缓冲中,并在那里计算数据。在待发数据大于所提供的缓冲这一事件中,缓冲内会尽量地填充数据。这时,rev调用就会产生SAESGSIZE错误。注意,消息长错误是在使用面向消息的协议时发生的。流协议把接入的数据缓存下来,并尽量地返回应用所要求的数据,即使待发数据的数量比缓冲大。因此,对流式传输协议来说,就不会碰到SAESGSIZE这个错误。5.1shutdn()intshutdn(SKETs;inth;);h参数可以是下面的任何一个值:SD_REEiVE、SD

17、_SEND或SD_BTH。假如是SD_REEIVE,就表示不允许再调用接收函数。对TP套接字来说,不管数据在等候接收,还是数据接连到达,都要重设连接,这一点一定要注意。假如换一种情况,UDP套接字上,仍然可以承受并排列数据。假如选择SE_SEND,表示不允许再调用发送函数。假如指定SD_BTH,那么表示取消连接两端的收发操作。5.2lsesket()lsesket函数用于关闭套接字,它的定义如下:intlsesket(SKETs);lsesket的调用会释放套接字描绘符,并且也释放套接字所占用的空间,再利用套接字执行调用就会失败,并出现SAENTSK错误。所有与其描绘符关联的资源都会被释放,其中包括丢弃所有等候处理的数据。在sket关于这个套接字连接的线程也将会被终止,待决的重叠操作也被删除。完成例程或完成端口能执行,但最后会失败,出现SA_PERATIN_ABRTED错误。除此之外,在我们的程序当中应该为每一个完成了的sket套接字调用lsesket函数,这样,将及时的把sket资源交还给系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论