`

UNIX网络编程 高级IO函数

 
阅读更多

 

套接字超时

在设计套接字的IO操作上设置超时的方法有以下三种

1)调用alarm,它在指定超时期慢时产生SIGALRM信号。这个方法设计信号处理,而信号处理在不同实现上

    存在差异,而且可能干扰进程中现有的alram调用

2)在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或者write调用上

3)使用交心的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法的问题在于并发所有实现都支持这

    两个套接字选项

以上三个技术都适用于输入和输出操作(如read,write以及recvfrom,sendto之类的变体)

 

recv和send函数

#include <sys/socket.h>
ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
ssize_t send(int sockfd, const void * buff, size_t nbytes, int flags);

I/O函数的flag参数

flag 说明 recv send
MSG_DONTROUTE

绕过路由表查找

本标志高速内核目的主机在某个直接连接的本地网络上,因为无需

执行路由表查找

 
MSG_DONTWAIT

仅本操作非阻塞

本标志在无需打开响应套接字的非阻塞标志的前提下,把单个IO

操作临时定位非阻塞,接着执行IO操作,然后关闭非阻塞标志

MSG_OOB

发送或接收带外数据

对于send,本标志指明即将发送带外数据。TCP连接上只有一个

字节可以作为带外数据发送。对于recv本标志指明即将读入的是

带外数据而不是普通数据

MSG_PEEK

窥看外来消息

本标志适用于recv和recvfrom,它允许我们查看已可读取的数据,

而且系统不再recv或recvfrom返回后丢弃这些数据

 
MSG_WAITALL

等待所有数据

它告知内核不要在尚未读入请求数目的字节之前让一个读操作返回。

 

其他的还有MSG_EOR指示逻辑记录的结束

flags参数设计上存在一个基本问题,它是按值传递的而不是值--结果参数。因此它只用于进程向内核传递,而

内核无法向进程传回标志

 

readv和writev函数

#include <sys/uio.h>
ssize_t readv(int filedes, const struct iovec * iov, int iovcnt);
ssize_t writev(int filedes, const struct iovec * iov, int iovcnt);
//返回: 读到或写出的字节数,出错时为-1

//iovec结构体如下
struct iovec {
    void *iov_base;   //buffer的起始地址
    size_t iov_len;    //buffer数量
};

 

recvmsg和sendmsg函数

#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags); 
ssize_t sendmsg(int sockfd, struct msghdr * msg, int flags);
 //返回: 成功时为读入或写出的字节数,出错时为-1

//这两个函数把大部分参数封装到一个msghdr结构体中
struct msghdr {
  void         *msg_name;        /* protocol address */
  socklen_t     msg_namelen;     /* size of protocol address */
  struct iovec *msg_iov;         /* scatter/gather array */
  int           msg_iovlen;      /* # elements in msg_iov */
  void         *msg_control;     /* ancillary data (cmsghdr struct) */
  socklen_t     msg_controllen;  /* length of ancillary data */
  int           msg_flags;       /* flags returned by recvmsg() */
};

 

 

 

 

 

 

 

 

 

 

 

 

假设从198.6.38.100端口2000达到一个170字节的UDP数据报,它的目标IP地址为206.168.112.96

下图是recvmsg返回时msghdr结构体重的所有信息

1)msg_那么成员指向的缓冲区被填以一个套接字地址结构,其中所有受到数据报的源IP地址和源UDP端口

2)msg_namelen成员(值--结构参数)被更新为存放在msg_name所指缓冲区中的数据量

3)所收取数据报的前100字节数据放在第一个缓冲区中,中间60字节放在第二个缓存区中,最后10个字节数据

   放在第三个缓冲区

4)msg_control成员指向的缓冲区被填以一个cmsghdr结构,该cmsghdr结构中,cmsg_len成员值为16,

    cmsg_level成员值为IPPROTO_IP,cmsg_type成员值为IP_RECVDSTADDR,随后4个字节存放所有

    收到UDP数据报的目的IP地址

5)msg_controllen成员被更新为所存放辅助数据的实际数据量,也是一个值--结果参数

6)msg_flags成员同样被recfmsg更新,不过没有标志返回给进程

 

 

 

五组I/O函数对比

函数 任何描述符 仅套接字描述符 单个读/写缓冲区 分散/集中读写 可选标志 可选对端地址 可选控制信息

read

write

         

readv

writev

         

recv

send

       

recvfrom

sendto

     

recvmsg

sendmsg

   

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 57.6 KB
  • 大小: 90.4 KB
分享到:
评论

相关推荐

    UNIX环境高级编程-005_标准IO库

    UNIX环境高级编程一套电子书! 一共23部分19章。最后4部分为:函数原型、其它源码、习题答案、参考资料 如果您对某章节感兴趣,则下载非常方便! 如果此资源有侵权,请通知我,我会及时撤销下载!

    UNIX环境高级编程_第二版

    在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。 书中...

    UNIX环境高级编程-011_终端IO

    UNIX环境高级编程一套电子书! 一共23部分19章。最后4部分为:函数原型、其它源码、习题答案、参考资料 如果您对某章节感兴趣,则下载非常方便! 如果此资源有侵权,请通知我,我会及时撤销下载!

    UNIX网络编程卷1:套接字联网API(第3版)part1 共2部分

    第6章 IO复用:select和poll函数 第7章 套接字选项 第8章 基本UDP套接字编程 第9章 基本SCTP套接字编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址转换 第三部分 第12章 IPv4与IPv6的互操作性 第13...

    UNIX环境高级编程(上).rar

    12 高级IO.pdf 13 精灵进程.pdf 14 进程间通信.pdf 15 高级进程间通信.pdf 16 数据库函数库.pdf 17 与PostScript 打印机通信.pdf 18 调制解调器拨号器.pdf 19 伪终端.pdf 20 附录A 函数原型.pdf 21 附录B ...

    UNIX高级环境编程

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用...

    Java网络编程--Unix域协议:实现

    Unix域协议:实现 17.1 概述 180 17.2 代码介绍 180 17.3 Unix domain和protosw结构 181 17.4 Unix域插口地址结构 182 17.5 Unix域协议控制块 183 17.6 uipc_usrreq函数 185 17.7 PRU_ATTACH请求和unp_attach函数 ...

    linux网络编程-宋敬彬-part1

    9.2 使用IO函数的例子 246 9.2.1 客户端处理框架的例子 246 9.2.2 服务器端程序框架 248 9.2.3 使用recv()和send()函数 249 9.2.4 使用readv()和write()函数 251 9.2.5 使用recvmsg()和sendmsg()函数 253 ...

    APUE(UNIX环境高级编程)——文件I/O篇

    本章开始讨论UNIX系统,先说明可用的文件I/O函数——打开文件、读文件、写文件等等。 大多数UNIX文件I/O只需用到5个函数: open read write lseek close 然后说明不同缓存器长度对read和write函数的影响。本章所...

    Java网络编程--Unix域协议:I/O和描述符的传递

    Unix域协议:I/O和描述符的传递 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp_dispose...

    linux 下 select 编程 librtspserver

    在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,服务器端断开连接。而客户端却不能及时知道,只有在客户输入完毕并发送到服务器的时候才知道连接已经断开,...

    PHP函数参考手册大全

    4. Unix 系统下的安装 5. Mac OS X 系统下的安装 6. Windows 系统下的安装 7. PECL 扩展库安装 8. 还有问题? 9. 运行时配置 III. 语言参考 10. 基本语法 11. 类型 12. 变量 13. 常量 14. 表达式 15. 运算符 16. ...

    linux 下 select 编程 librtspserver.rar

    在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,服务器端断开连接。而客户端却不能及时知道,只有在客户输入完毕并发送到服务器的时候才知道连接已经断开,...

    unix编译环境全面分析(全面讲解unix编译环境让开发更清晰)

    Unix系统函数 内存管理 内存管理在语言结构上的变化 Unix/Linux内存管理 物理内存和虚拟内存 5 C风格的内存分配程序 Unix/Linux的基本内存分配程序 Linux标准IO 目录管理 系统信息 时间与日期

    linux_aio.zip_LINUX下开启AIO_aio glibc_aio 两种方式_linux aio_linux_aio

    Linux 下实现异步IO有两种方式,一种是调用glibc的aio,本代码是在学习Unix环境高级编程时测试的glibc的aio函数,有详细的README说明文档和注释。

    linux网路编程 中文 23M 版

    第2 章Linux编程环境....................................................................................................14 2.1 Linux环境下的编辑器................................................. 14 ...

    C-plus-plus-Series:学习C ++的旅程

    UNIX编程 C ++多线程 C ++入门笔记与归纳 C ++入门手册第五版笔记与知识点整合 一.C ++基础知识 二。函数 三。类 四.IO库 ##五。顺序容器 六。泛型编程 七。关联容器 八。动态内存 九。拷贝控制 十。重载运算与类型...

    Linux探秘之I/O效率

     近看了《UNIX环境高级编程》,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对read、write、fread、fwrite、printf等等这些函数又有了新的认识。...

    嵌入在Python的x86-64汇编器PeachPy.zip

    C 头文件生成的函数JSON 格式的函数元数据基于 Python 的元编程和代码生成多个指令流的复用(有助于软件流水线)兼容 Python 2 和 Python 3,CPython 和 PyPy在线 DEMO: PeachPy.IO 标签:PeachPy

    中文版PHP使用手册

    4. Unix 系统下的安装 5. Mac OS X 系统下的安装 6. Windows 系统下的安装 7. PECL 扩展库安装 8. 还有问题? 9. 运行时配置 III. 语言参考 10. 基本语法 11. 类型 12. 变量 13. 常量 14. 表达式 15. 运算符 16. ...

Global site tag (gtag.js) - Google Analytics