现在的位置: 首页 > 综合 > 正文

Network Programming for Windows读书笔记5

2013年10月18日 ⁄ 综合 ⁄ 共 659字 ⁄ 字号 评论关闭

   3.recv和WSARecv

  对在已连接套接字上接受接受数据来说,recv函数是最基本的方式.它的定义如下:

 int recv(

     SOCKET s,

    char  FAR* buf,

    int len,

    int flags

);

    第一个参数s,是准备接受数据的那个套接字.第二个参数buf,是即将收到数据的字符缓冲,而len则是准备接受的字节数或buf缓冲的长度.最后,flags参数可以是下面的值:0、MSG_PEEK或MSG_OOB.另外,还可对这些标志中的每一个进行按位和运算.当然,0表示无特殊行为.MSG_PEEK会使有用的数据复制到所提供的接受端缓冲内,但是没有从系统缓冲中将它删除.另外,还返回了待发字节数.

    消息取数不太好.它不仅导致性能下降(因为需要进行两次系统调用,一次是取数,另一次是无MSG_PEEK标志的真正删除数据的调用),在某些情况下还可能不可靠.返回的数据可能没有反射出真正有用的数量。与此同时,把数据留在系统缓冲,可容纳接入数据的系统空间就会越来越少.其结果便是,系统减少个发送端的TCP窗口容量.由此,你的应用就不能获得最大的流通.最好是把所有数据都复制到自己的缓冲中,并在那里计算数据.前面曾介绍过MSG_OOB标志.有关详情,参见前面"带外数据"的内容.

    在面向消息或面向数据报的套接字上使用recv时,这几点应该注意.在待发数据大于所提供的缓冲这一事件中,缓冲内会尽量地填充数据.这时,recv调用就会产生WSAEMSGSIZE错误.注意,消息长错误是在使用

【上篇】
【下篇】

抱歉!评论已关闭.