第四讲 Windows网络编程.ppt

  1. 1、本文档共125页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第一个参数s,是已建立连接的套接字; 第二和第三个参数是接收数据的缓冲。lpBufferss参数是一个WSABUF结构组成的数组,而dwBufferCount则表明前一个数组中WSABUF结构的数目; 第四个参数lpNumberOfBytesReceived参数在接收操作完成后,指向执行这个函数调用所收到的字节数; 第五个参数lpFlags可以是下面任何一个值:MSG_PEEK、 MSG_OOB、MSG_PARTIAL或者对这些值进行按位和运算之后的结果; 最后的参数lpOverlapped和lpCompletionROUTINE参数用于重叠I / O操作。 注: MSG_PARTIAL标志使用和出现的地方不同,其含义也不同。对面向消息的协议来说,这个标志是WSARecv调用返回后设置的(如果因为缓冲空间不够导致整条消息未能在这次调用中返回的话)。这时,后面的WSARecv调用就会设置这个标志MSG_PARTIAL ,直到整条消息返回,才把这个标志清除。如果这个标志当作一个输入参数投递,接收操作应该在一收到数据就结束,即使它收到的只是整条消息中的一部分。 MSG_PARTIAL标志只随面向消息的协议一起使用。每个协议的协议条目都包含一个标志,表明是否支持这一特性。 (四)流协议   由于大多面向连接的协议同时也是流式传输协议,在流式协议中,对于流套接字上收发数据所用的函数,不能保证对一定按照请求的数据量进行读取或写入。   如程序所示,一个2048字节的字符缓冲,准备用send函数来发送,函数返回的已发出字节数可能会少于2048字节,在程序种ret变量记录了实际发送的字节数。   这是因为对每个收发数据的套接字来说,系统都为它们分配了相当充足的缓冲区空间。在发送数据时,内部缓冲区会将数据一直保留到将它发送到网络上为止。   如程序所示,不断发送缓冲区中内容直至数据发送完毕为止。   用户可以在自己定义的协议中定义长度,以便通知对方进行正确的处理。 消息长度不同,处理也可能不同。因此,有必要利用你自己的协议来通知接收端,即将到来的消息长度是多少。 比方说,写入接收端的前4个字节一直是整数,表示即将到来的消息有多少字节。然后,接收端先查看前4个字节的方式,把它们转换成一个整数,然后判断构成消息的字节数是多少,通过这种方式,便开始逐次读取。 为了保证通信方能够收到应用发出的所有数据,对一个编得好的应用来说,应该通知接收端“不再发送数据”。同样,通信方也应该如此。这就是所谓的“从容关闭”方法,并由shutdown函数来执行。 (五)中断连接   一旦完成任务,就必须关掉连接,释放关联到那个套接字句柄的所有资源。要真正地释放与一个开着的套接字句柄关联的资源,执行closesocket调用即可。 但要注意一点,closesocket可能会带来负面影响(和如何调用它有关),即可能会导致数据的丢失。鉴于此,应该在调用closesocket函数之前,利用shutdown函数从容中断连接。 (1) shutdown函数 如果是SD_RECEIVE,就表示不允许再调用接收函数。这对底部的协议层没有影响。另外,对TCP套接字来说,不管数据在等候接收,还是数据接连到达,都要重设连接。尽管如此,UDP套接字上,仍然接受并排列接入的数据。 如果是SD_SEND,表示不允许再调用发送函数。对TCP套接字来说,这样会在所有数据发出,并得到接收端确认之后,生成一个FIN。 如果指定SD_BOTH,则表示取消连接两端的收发操作。 第一个参数s,是准备接收数据的那个套接字; 第二个参数how,可以是以下的任何一个值:    SD_RECEIVE、SD_SEND或SD_BOTH。 (2) closesocket函数   closesocket的调用会释放套接字描述符,再利用套接字执行调用就会失败,并出现WSAENOTSOCK错误。如果没有对该套接字的其他引用,所有与其描述符关联的资源都会被释放。其中包括丢弃所有等侯处理的数据。 注:对这个进程中任何一个线程来说,它们执行的待决异步调用都在未投递任何通知消息的情况下被删除。待决的重叠操作也被删除。与该重叠操作关联的任何事件,完成例程或完成端口能执行,但最后会失败,出现WSA_OPERATION_ABORTED错误。 (六)面向连接协议的示例   利用前面所讲的原理和函数,对一个简单的客户机/服务器示例进行分析。   服务器示例程序中包含的代码是一个简单的回应服务器的。该服务器程序建立了一个套接字,绑定了一个本地I P接口和端口,并监听客户机连接。在收到客户机连接请求之后,又建立了一个新套接字,再把这个新套接字投递到一个再生的客户机进程中。由这个线程只读读数据,并把它发回客户机。   客

文档评论(0)

wxc6688 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档