http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net
分类: LINUX
2011-09-26 19:26:30
有三种方法给套接口上的I/O操作设置超时:
1)调用alarm,在到达指定时间时产生SIGALRM信号;
2)使用select阻塞在等待I/O上,select内部有一个时间限制,以此代替在read或write调用上的阻塞;
3)使用新的SO_RCVTIMEO和SO_SNDTIMEO套接口选项,但不是所有的实现都能支持这两个套接口选项。
注意: 那两个新的套接口选项对connect不起作用,前两种技术可以用于任何描述字,而第三种技术只能用于套接口描述字。
调用alarm技术可以减少connect的超时时间,但不能延长内核中已有的超时时间,源自Berkeley的内核中connect的超时时间一般是75秒,我们可以设定一个比它小的超时值。
13.5 recvmsg和sendmsg函数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)一些实现支持ioctl的FIONREAD命令。
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调用代替了通常的connect、write和shutdown调用序列。