1、recv 和 send 函数
flags 在赋值的时候,直接赋值为0就行了(默认值)
相较于 read、write的却别:在接受/传输数据时可带可选项(如MSG_OOB)
数据接收
#include <sys/socket.h>
ssize_t read( int fd, void *buf, size_t count );
ssize_t recv( int sockfd, void *buf, size_t nbytes, int flags );
功能:
将fd内的数据读入buf文件。
参数:
返回值:
成功,返回接收的字节数(收到EOF时返还已0);失败,返回 -1。
数据发送
#include <sys/socket.h>
ssize_t write( int fd, const void *buf, size_t count );
ssize_t send( int sockfd, const void *buf, size_t nbytes, int flags );
功能:
将buf内的数据写入文件。
参数:
返回值:
成功,返回发送的字节数;失败,返回-1。
send & recv函数的可选项及含义
可以写0。
send函数和recv函数的最后一个参数是收发数据时的可选项。该可选项可利用位或( bit OR )运算( | [运算符)同时传递多个信息。通过表13-1整理可选项的种类及含义。
【注】
MSG_OOB:用于发送紧急消息。但是传输速率并没有加快、且只能读取1字节数据。
(p.s. 最好间隔着 sleep(2),不然消息传输太快,啥都看不到)
2、函数 readv() 、writev()
writev() 函数
#include <sys/uio.h>
ssize_t writev( int filedes, const struct iovec *iov, int iovcnt );
功能:
将分散保存于多个缓冲区中的数据一并发送。
参数:
【注】
filedes
写 1的话,直接从iov写到终端。
写 STDOUT_FILENO 的话,得加头文件#include <unistd.h> 直接从iov写到终端。
返回值
成功,返回发送的字节数;失败,返回 -1。
【补】结构体 iovec
struct iovec
{
void *iov_base; //缓冲地址
size_t iov_len; //缓冲大小
}
readv() 函数
#include <sys/uio.h>
ssize_t readv( int filedes, const struct iovec *iov, int iovcnt );
功能:
从多个缓冲区中分别接受数据。
参数:
【注】 filedes 写0 的话,直接从终端的标准输入中接受数据。
返回值
成功,返回发送的字节数;失败,返回 -1。
3、习题
2)利用readv&writev函数收发数据有何优点?分别从函数调用次数和I/O缓冲的角度给出说明:
答:readv&writev函数可以将分散保存在多个缓冲中的数据一并接受和发送,是对数据进行整合传输及发送的函数,因此可以进行更有效的数据传输。而且,输入输出函数的调用次数也相应减少,也会产生相应的优势
3)通过recv函数见证输入缓冲是否存在数据时(确认后立即返回),如何设置recv函数最后一个参数中的可选项?分别说明各可选项的含义:
答:同时设置MSG_PEEK选项和MSG_DONTWAIT选项,以验证输入缓冲是否存在可接收的数据。设置MSG_PEEK选项并调用recv函数时,即使读取了输入缓冲数据也不会删除。因此,该选项通常与MSG_DONTWAIT合作,用于调用以非阻塞方式验证待读数据存在与否的函数。
4)可在Linux平台通过注册时间处理函数接收MSG_OOB数据。那Windows中如何接受?请说明接收方法:
答:MSG_OOB数据的接收,在select函数中属于异常数据,既在Windows中可以通过异常处理来接收Out-of-band数据。