send & recv

include <sys.socket.h>

ssize_t send(int sockfd, const void *buf, ssize_t nbytes, int flags);

ssize_t recv(int sockfd, const void *buf, ssize_t nbytes, int flags);
/**
 * sockfd:  表示数据接收对象的连接的套接字文件描述符
 * buf:     保存接收数据的缓冲区地址
 * nbytes:  可接受的最大字节数
 * flags:   接收数据时可选项信息
*/

成功时返回接收的字节数(收到EOF则返回0),失败则返回-1

flags含义sendrecv
MSG_OOB用于传输带外数据(Out-of-band data)··
MSG_PEEK验证缓冲区中是否存在接收的数据·
MSG_DONTROUTE数据传输过程中不参照路由(Routing)表,在本地(Local)网络中寻找目的地·
MSG_DONTWAIT调用I/O函数不阻塞,用于使用非阻塞(Non-blocking)I/O··
MSG_WAITALL防止函数返回,直到接受全部请求的字节数·

MSG_OOB的真正意义在于督促数据接收对象尽快处理数据。这是紧急模式的全部内容,而且tcp“保持传输顺序”的传输特性依然成立。

readv & writev

对数据进行整合传输及发送的函数。也就是说,writev可以将分散保存在多个缓冲区中的数据一并发送,通过readv函数可以由多个缓冲分别接收。

#include <sys/uio.h>

ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);
ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);
/**
 * filedes: 表示数据传输对象的套接字文件描述符(或者像`read`函数那样,传递文件描述符或标准输出描述符)
 * iov:     iovec结构体数组的地址值
 * iovcnt:  第二个参数的数组长度
*/

成功时返回发送的字节数,失败则返回-1

Example: example: writev.c example: readv.c

struct iovec 
{
    void *iov_base; //缓冲地址
    size_t iov_len; //缓冲大小
};