《网络编程》- 第13章 – 多种I/O函数

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数据。

代码入口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值