最早使用的read与write函数,下面是几种提供额外功能的I/O函数。
1.recv与send函数
#include "sys/socket.h"
ssize_t recv(int sockfd, void * buff, ssize_t nbytes, int flags)
ssize_t send(int sockfd, void * buff, ssize_t nbytes, int flags) 错误返回-1,成功则则返回读入或者写出的字节数。
除了最后多了个参数flags意外,其它的和read和write并没有太多区别,对于flags有以下几种值:
MSG_DONTROUTE:不查路由表
MSG_DONTWAIT:本操作不阻塞
MSG_OOB:发送或者接受外带数据
MSG_PEEK:查看外来信息
MSG_WAITALL:等待所有数据 (所谓的所有数据,是以接受到fin包为准,而不是一次发送的数据)
2.readv与writev
#include "sys/uio.h"
ssize_t readv(int fiedes, const struct iovec * iov, int iovcnt);
ssize_t writev(int fiedes, const struct iovec * iov, int iovcnt);
readv 和 writev 函数用于在 一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数成为散布读和聚集写。
这两个函数的第二个参数是指向 iovec 结构数组的一个指针:
struct iovec{
void *iov_base;
size_t iov_len;
};
writev 以顺序 iov[0] 至 iov[iovcnt-1] 从缓冲区中聚集输出数据。 writev 返回输出的字节总数,通常,它应等于所有缓冲区长度之和。
readv 则将读入的数据按上述同样顺序散布读到缓冲区中。 readv 总是先填满一个缓冲区,然后再填写 下一个。 readv 返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回 0 。
3.recvmsg与sendmsg函数。
相对之前的几个IO函数,这个比较麻烦,所以另开一张单独说明。