Chinaunix首页 | 论坛 | 博客
  • 博客访问: 334355
  • 博文数量: 214
  • 博客积分: 4258
  • 博客等级: 上校
  • 技术积分: 2021
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-02 09:16
个人简介

http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net

文章分类

全部博文(214)

文章存档

2018年(16)

2015年(1)

2014年(2)

2012年(22)

2011年(173)

分类: LINUX

2011-09-26 19:26:30

13.2 套接口超时

       有三种方法给套接口上的I/O操作设置超时:

1)调用alarm,在到达指定时间时产生SIGALRM信号;

2)使用select阻塞在等待I/O上,select内部有一个时间限制,以此代替在readwrite调用上的阻塞;

3)使用新的SO_RCVTIMEOSO_SNDTIMEO套接口选项,但不是所有的实现都能支持这两个套接口选项。

 

注意: 那两个新的套接口选项对connect不起作用,前两种技术可以用于任何描述字,而第三种技术只能用于套接口描述字。

       调用alarm技术可以减少connect的超时时间,但不能延长内核中已有的超时时间,源自Berkeley的内核中connect的超时时间一般是75秒,我们可以设定一个比它小的超时值。

13.5 recvmsgsendmsg函数

size_t  recvmsg(int  sockfd, struct  msghdr  *msg, int  flags);

size_t  sendmsg(int  sockfd, struct  msghdr  *msg, int  flags);

返回:成功时为读入或写出的字节数,出错时为-1

13.9 recvmsg返回时对图13.8的更新

 

 

 

 

13.7 排队的数据量

       在不读出数据的情况下,如何知道一个套接口的接收队列中有多少数据可读呢?有三种方法:

1)如果在没有数据可读时还有其他事情要做,为了不阻塞在内核中,可以使用非阻塞I/O

2)如果想检查一下数据而使数据仍留在接收队列中,可以使用MSG_PEEK标志。如果想这样做,但又不能肯定是否有数据可读,可以把这个标志和非阻塞套接口相结合,或与MSG_DONTWAIT标志结合使用。

3)一些实现支持ioctlFIONREAD命令。

13.8 套接口和标准I/O

       标准I/O库可以用于套接口,但有几点要考虑。

1)对任何描述字调用fdopen函数都可以生成一个标准I/O流。同样,对于一个标准I/O流,用fileno可以得到对应的描述字。

 2)

3)

大多数Unix中标准I/O库的实现遵循了一下规则:

1)标准错误输出总数不缓冲的;

2)标准输入和标准输出是全缓冲的。除非它们是一个终端设备,那样的话它们是行缓冲的;

3)其他的流都是全缓冲的,除非它们是一个终端设备,那样的话它们是行缓冲的。

 

13.9 T/TCP:事务TCP

 

        T/TCP是对TCP的一个简单的增强,能在客户和服务器最近曾通信过的情况下避免三路握手,使服务器对客户的请求更快地做出响应。从编程的角度来看,其优点在于,客户程序以sendto调用代替了通常的connectwriteshutdown调用序列。

阅读(361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~