套接字超时
涉及套接字的IO操作上设置超时的方法有三种
1.调用Alarm
2.select阻塞等待IO
3.新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项
1.调用Alarm并且设置信号处理函数流程
2.为select指定时间参数即可完成超时事件
3.setsockopt为套接字设定超时(不是所有的系统都支持)
recv和send函数
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
其中flag参数有以下的取值
readv和sendv函数
类似于read和write函数,这些操作也被称为分散读和集中写
extern ssize_t readv (int __fd, const struct iovec *__iovec, int __count)
__wur __attr_access ((__read_only__, 2, 3));
其中iovec结构为
struct iovec
{
void *iov_base; /* Pointer to data. */
size_t iov_len; /* Length of data. */
};
recvmsg和sendmsg函数
最为通用的IO函数,所有的read,readv,recv,recvfrom皆可转换成recvmsg调用
extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags);
其中message结构体为
struct msghdr
{
void *msg_name; /* Address to send to/receive from. */
socklen_t msg_namelen; /* Length of address data. */
struct iovec *msg_iov; /* Vector of data to send/receive into. */
size_t msg_iovlen; /* Number of elements in the vector. */
void *msg_control; /* Ancillary data (eg BSD filedesc passing). */
size_t msg_controllen; /* Ancillary data buffer length.
!! The type should be socklen_t but the
definition of the kernel is incompatible
with this. */
int msg_flags; /* Flags on received message. */
};
套接字和标准IO
Unix IO(read,write以及他们的变体,详见上面的表格),标准IO是为了可移植性创建的,需要考虑其创建的自动输入输出缓冲
标准输入输出总是执行下面三类缓冲原则
1.完全缓冲(只有缓冲区满或者显式调用flush才缓冲)
2.行缓冲(碰到换行符或者调用flush才缓冲)
3.不缓冲(每次调用都直接发生IO)