一: 套接字超时: 一般通过select的timeout参数实现(timeout=NULL阻塞, =0的timeval非阻塞, 非0timeval超时)
fd_set rset; FD_ZERO(&rset); FD_SET(&rset,fd); timaval t; t.tv_sec=5; t.tv_usec=0; int ret = select(&rset,NULL,NULL,&t); if(ret=0) printf("timeout!\n"); else read(fd,buf,buflen);
二, recv和send 函数
#include <sys/socket.h>
ssize_t recv(in fd, void* buf, size_t len,int flags);
ssize_t send(int fd, const void* buff, size_t len, int flags);
这两个函数币read/write 多了一个flags参数,用来设置模式,一般情况下设为0,其中可能用到的的有:
MSG_DONTWAIT: 仅本次操作阻塞
MSG_PEEK:查看收到的数据, 而这些数据不会被丢弃(即可以多次recv), 经常与MSG_DONTWAIT同时使用
MSG_WAITALL: 等待所有数据, 可用于实现"等到某个固定数目的数据可读为止" 的需求
三,readv和writev函数
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec* iov, int iovcnt);
ssize_t writev(int fd, const struct iovec* iov, int iovcnt);
struct iovec{
void* iov_base;
size_t iov_len;
};
这两个函数被称为分散读/集中写
readv 会一次读入多个buf, 并且总是读满一个再读入下一个
writev 将多个buf中的数据写出去, 起重要应用是可以避免TCP的Negle算法
四:标准C函数
可以用fdopen打开一个fd来获得一个FILE*, 但是每次读写操作必须要进行fflush操作
这样做的其中一个好处是可以用fprintf来直接输出/输入格式化信息,(从而省掉缓冲区)
不过最好不要这样用~, 以避免一些可能奇怪的问题.