套接字超时
在设计套接字的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 |
是 | 是 | 是 | 是 | 是 |
相关推荐
《Unix网络编程(第三版)源码》是网络编程领域中的经典参考资料,源自著名书籍《Unix网络编程》的第三版。这本书深入浅出地讲解了网络通信的各种技术和实践,源码部分则是书中理论的实证,对于学习和理解Unix环境下...
1. **套接字API**:Unix网络编程的核心是套接字(Socket)API,它提供了一组函数接口,如socket()、bind()、listen()、accept()、connect()、send()、recv()等,用于创建、绑定、监听、连接、发送和接收数据。...
《Unix网络编程》第二版是网络编程领域的一部经典之作,分为两卷,全面而深入地探讨了在Unix操作系统上进行网络通信的各种技术和方法。这本书不仅涵盖了基础的TCP/IP协议族,还涉及到了高级的并发服务、多线程编程、...
本主题聚焦于“网络编程IO模型源代码”,特别是使用C++语言和Windows Socket(Winsock)API的实现。 首先,让我们探讨IO模型的基本概念。IO模型主要有五种:同步阻塞IO、同步非阻塞IO、I/O多路复用、信号驱动IO和...
UNIX环境高级编程第二版中文版涵盖了在UNIX环境下进行高级编程的一系列知识和技巧,特别是对于希望深入学习UNIX系统编程的初学者来说,这本书提供了丰富的示例和练习,帮助他们掌握UNIX编程的核心概念和实践技能。...
《UNIX环境高级编程》是一本深入探讨UNIX系统编程的电子书,共分为23个部分,涵盖19章。在这一章中,作者主要讲解了标准I/O库,这是一个在多个操作系统上广泛实现的库,由ANSI C标准定义。标准I/O库的设计目的是简化...
UNIX环境高级编程是一本专注于C语言编程的高级书籍,主要涉及UNIX系统的深层次使用和编程技巧。本书不仅涵盖了UNIX系统的文件结构、IO库等基础知识,而且深入探讨了进程管理、进程间通讯等高级话题。UNIX系统是多...
高级网络编程涉及到Linux网络编程的进阶知识,包括非阻塞IO、IO多路复用、多线程/多进程网络编程、以及高性能网络服务器的设计。例如,select()和poll()函数可以用于管理多个套接字的IO事件,而epoll()是用于大规模...
《Unix网络编程》卷1,主要聚焦在套接字(Sockets)这一核心概念上,是网络编程领域的一本经典著作。这本书详细介绍了如何在Unix系统中使用套接字进行网络通信,涵盖了从基础概念到高级技术的广泛内容。下面将深入...
- **Unix编程环境**:包括但不限于编译器、调试器、链接器等工具,以及shell脚本编写能力。 #### 二、C语言在Unix中的应用 - **C语言基础**:介绍C语言的基本语法、数据类型、控制结构等内容。 - **C语言与Unix ...
《UNIX网络编程 卷1:源代码》是网络编程领域的一部经典著作,主要涵盖了套接字联网API的深入理解和实际应用。这本书的第3版提供了全面、详细的UNIX系统下的网络编程指南,对于想要深入理解网络通信机制的开发者来说...
在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。 书中...
3. **fcnt1 与 dup2 函数**:fcnt1函数未在描述中给出具体功能,但在UNIX编程中,`dup2()`函数用于复制一个文件描述符到另一个文件描述符,通常用于将标准输入、输出、错误重定向到指定的文件描述符。实现`dup2()`...
"IO-example.rar_io函数调用"这个标题暗示我们将会探讨一个关于C语言中的IO函数使用的实例。在这个例子中,可能包含如何创建管道(pipe)来实现进程间通信(IPC),以及如何使用不同的IO函数来读写数据。 描述中...
9. **标准IO库**:stdio.h中定义的printf、scanf等函数提供了一种高级的I/O抽象,但效率可能低于系统调用。了解何时使用它们和何时转向更低级别的I/O操作。 10. **错误处理**:程序出错时,应适当地处理errno和...