16.I/O函数

最早使用的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函数,这个比较麻烦,所以另开一张单独说明。



猜你喜欢

转载自memorymyann.iteye.com/blog/648360