`

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网络编程(第三版)源码

    《Unix网络编程(第三版)源码》是网络编程领域中的经典参考资料,源自著名书籍《Unix网络编程》的第三版。这本书深入浅出地讲解了网络通信的各种技术和实践,源码部分则是书中理论的实证,对于学习和理解Unix环境下...

    Unix网络编程卷一CHMpdf中英文源码

    1. **套接字API**:Unix网络编程的核心是套接字(Socket)API,它提供了一组函数接口,如socket()、bind()、listen()、accept()、connect()、send()、recv()等,用于创建、绑定、监听、连接、发送和接收数据。...

    unix网络编程第2版(1+2卷)(高清带书签)

    《Unix网络编程》第二版是网络编程领域的一部经典之作,分为两卷,全面而深入地探讨了在Unix操作系统上进行网络通信的各种技术和方法。这本书不仅涵盖了基础的TCP/IP协议族,还涉及到了高级的并发服务、多线程编程、...

    网络编程IO模型源代码

    本主题聚焦于“网络编程IO模型源代码”,特别是使用C++语言和Windows Socket(Winsock)API的实现。 首先,让我们探讨IO模型的基本概念。IO模型主要有五种:同步阻塞IO、同步非阻塞IO、I/O多路复用、信号驱动IO和...

    UNIX环境高级编程第二版中文版

    UNIX环境高级编程第二版中文版涵盖了在UNIX环境下进行高级编程的一系列知识和技巧,特别是对于希望深入学习UNIX系统编程的初学者来说,这本书提供了丰富的示例和练习,帮助他们掌握UNIX编程的核心概念和实践技能。...

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

    《UNIX环境高级编程》是一本深入探讨UNIX系统编程的电子书,共分为23个部分,涵盖19章。在这一章中,作者主要讲解了标准I/O库,这是一个在多个操作系统上广泛实现的库,由ANSI C标准定义。标准I/O库的设计目的是简化...

    UNIX环境高级编程

    UNIX环境高级编程是一本专注于C语言编程的高级书籍,主要涉及UNIX系统的深层次使用和编程技巧。本书不仅涵盖了UNIX系统的文件结构、IO库等基础知识,而且深入探讨了进程管理、进程间通讯等高级话题。UNIX系统是多...

    Linux网络编程1.pdf

    高级网络编程涉及到Linux网络编程的进阶知识,包括非阻塞IO、IO多路复用、多线程/多进程网络编程、以及高性能网络服务器的设计。例如,select()和poll()函数可以用于管理多个套接字的IO事件,而epoll()是用于大规模...

    unix网络编程

    《Unix网络编程》卷1,主要聚焦在套接字(Sockets)这一核心概念上,是网络编程领域的一本经典著作。这本书详细介绍了如何在Unix系统中使用套接字进行网络通信,涵盖了从基础概念到高级技术的广泛内容。下面将深入...

    unix环境高级编程

    - **Unix编程环境**:包括但不限于编译器、调试器、链接器等工具,以及shell脚本编写能力。 #### 二、C语言在Unix中的应用 - **C语言基础**:介绍C语言的基本语法、数据类型、控制结构等内容。 - **C语言与Unix ...

    UNIX网络编程 卷1:源代码

    《UNIX网络编程 卷1:源代码》是网络编程领域的一部经典著作,主要涵盖了套接字联网API的深入理解和实际应用。这本书的第3版提供了全面、详细的UNIX系统下的网络编程指南,对于想要深入理解网络通信机制的开发者来说...

    UNIX环境高级编程_第二版

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

    武大UNIX环境高级编程2019年考试题目(考后回忆版).doc

    3. **fcnt1 与 dup2 函数**:fcnt1函数未在描述中给出具体功能,但在UNIX编程中,`dup2()`函数用于复制一个文件描述符到另一个文件描述符,通常用于将标准输入、输出、错误重定向到指定的文件描述符。实现`dup2()`...

    IO-example.rar_io函数调用

    "IO-example.rar_io函数调用"这个标题暗示我们将会探讨一个关于C语言中的IO函数使用的实例。在这个例子中,可能包含如何创建管道(pipe)来实现进程间通信(IPC),以及如何使用不同的IO函数来读写数据。 描述中...

    《linux/unix系统编程手册》官方参考源码

    9. **标准IO库**:stdio.h中定义的printf、scanf等函数提供了一种高级的I/O抽象,但效率可能低于系统调用。了解何时使用它们和何时转向更低级别的I/O操作。 10. **错误处理**:程序出错时,应适当地处理errno和...

Global site tag (gtag.js) - Google Analytics