- 浏览: 140271 次
文章分类
最新评论
下面几种方法可用来获取和设置影响套接字的选项:
(1)getsockopt 和 setsockopt 函数;
(2)fcntl 函数;
(3)ioctl 函数。
本文将介绍 getsockopt 和 setsockopt 函数,对 fcntl 的介绍见fcntl 函数介绍,而对 ioctl 的介绍则留到后面。
其中参数 sockfd 指向一个打开的套接字描述符,level 指定系统中解释选项的代码或为通用套接字代码,或为某个特定于协议的代码(如 IPv4、IPv6、TCP 或 SCTP)。optval 是一个指向某个变量的指针,setsockopt 从 *optval 处取得选项 optname 待设置的新值,getsockopt 则把已获取的选项 optname 的当前值存放到 *optval 中。*optval 的大小由 optlen 参数指定。
套接字选项粗分为两大基本类型:一是启用或禁止某个特性的二元选项(称为标志选项),二是取得并返回可以设置或检查的特定值的选项(称为值选项)。下面的两张表汇总了可由 getsockopt 和 setsockopt 获取和设置的选项。其中的“数据类型”列给出了指针 optval 必须指向的每个选项的数据类型(这一列中后跟一对花括号的记法表示一个结构,如 linger{} 就表示 struct linger),标有“标志”的列指出一个选项是否为标志选项,当 *optval 的值是 0 时表示选项被禁止,反之则表示开启。如果“标志”列不含有“·”,那么相应选项用于在用户进程与系统之间传递所指定数据类型的值。
其中的这几个套接字选项是由 TCP 已连接套接字从监听套接字继承的:SO_DEBUG、SO_DONTROUTE、SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_RCVLOWAT、SO_SNDBUF、SO_SNDLOWAT、TCP_MAXSEG 和 TCP_NODELAY。这对 TCP 是很重要的,因为 accept 一直要到 TCP 层完成三路握手后才会给服务器返回已连接套接字。如果想在三路握手完成时确保这些套接字选项中的某一个是给已连接套接字设置的,那么必须先给监听套接字设置该选项。
(1)getsockopt 和 setsockopt 函数;
(2)fcntl 函数;
(3)ioctl 函数。
本文将介绍 getsockopt 和 setsockopt 函数,对 fcntl 的介绍见fcntl 函数介绍,而对 ioctl 的介绍则留到后面。
#include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); /* 两个函数的返回值:若成功,返回 0;否则,返回 -1 */
其中参数 sockfd 指向一个打开的套接字描述符,level 指定系统中解释选项的代码或为通用套接字代码,或为某个特定于协议的代码(如 IPv4、IPv6、TCP 或 SCTP)。optval 是一个指向某个变量的指针,setsockopt 从 *optval 处取得选项 optname 待设置的新值,getsockopt 则把已获取的选项 optname 的当前值存放到 *optval 中。*optval 的大小由 optlen 参数指定。
套接字选项粗分为两大基本类型:一是启用或禁止某个特性的二元选项(称为标志选项),二是取得并返回可以设置或检查的特定值的选项(称为值选项)。下面的两张表汇总了可由 getsockopt 和 setsockopt 获取和设置的选项。其中的“数据类型”列给出了指针 optval 必须指向的每个选项的数据类型(这一列中后跟一对花括号的记法表示一个结构,如 linger{} 就表示 struct linger),标有“标志”的列指出一个选项是否为标志选项,当 *optval 的值是 0 时表示选项被禁止,反之则表示开启。如果“标志”列不含有“·”,那么相应选项用于在用户进程与系统之间传递所指定数据类型的值。
其中的这几个套接字选项是由 TCP 已连接套接字从监听套接字继承的:SO_DEBUG、SO_DONTROUTE、SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_RCVLOWAT、SO_SNDBUF、SO_SNDLOWAT、TCP_MAXSEG 和 TCP_NODELAY。这对 TCP 是很重要的,因为 accept 一直要到 TCP 层完成三路握手后才会给服务器返回已连接套接字。如果想在三路握手完成时确保这些套接字选项中的某一个是给已连接套接字设置的,那么必须先给监听套接字设置该选项。
发表评论
-
Unix 域套接字与描述符的传递
2019-03-27 23:59 709在Unix 域套接字概述一节中介绍了什么是 U ... -
Unix 域套接字概述
2019-03-12 22:48 975Unix 域协议并不是一个实际的协议族,而是在 ... -
kqueue 接口
2019-03-06 00:47 683kqueue 接口是 ... -
辅助数据
2019-02-28 00:40 684辅助数据(a ... -
recv/send 和 recvmsg/sendmsg 函数
2019-01-22 00:40 1535recv 和 send ... -
inetd 守护进程介绍
2019-01-09 21:51 1046在 4.3 BSD 系统之前,很多网络服务都是 ... -
主机名与 IP 地址的转换(续)
2018-12-25 00:37 953在主机名与 IP 地址的转换一节中提到的 ge ... -
主机名与 IP 地址的转换
2018-11-14 00:20 2298在网络编程中,尽管大部分情况下操作的都是 IP ... -
SCTP 事件通知
2018-02-08 03:49 973SCTP 提供了多种可用的通知,用户可经由这些通知追踪 ... -
SCTP 套接字选项
2018-02-04 09:35 1682在获取和设置套接 ... -
SCTP 套接字编程基础函数
2018-02-04 10:08 1048SCTP 服务器可以使 ... -
SCTP 套接字编程基础概念
2018-01-18 00:10 559SCTP 套接字分为一到一套接字和一到多套接字。提供一 ... -
UDP套接字编程基础
2018-01-14 10:37 570下图显示了使用 UDP 套接字编写客户/服务器程序时的 ... -
通用套接字选项
2018-01-02 00:46 545在获取和设置套接 ... -
I/O 复用之 poll 函数
2017-12-27 00:20 421poll 函数提供的功能与 select 类似,不过在 ... -
I/O 复用之select 函数
2017-12-12 00:32 514select 函数允许进 ... -
Unix 5 种 IO 模型概述
2017-11-19 01:44 304Unix 下有 5 种可用 ... -
套接字创建、连接和关闭函数
2017-08-13 17:16 661下图是一对 TCP 客户与服务器进程之间发生的一些典型 ... -
字节转换和填充函数
2017-08-06 01:09 426网络编程中,为保证发送协议栈和接收协议栈就如 32 位 ... -
IPv4 和 IPv6 的套接字地址结构
2017-08-01 21:03 735大多数套接字函数 ...
相关推荐
- `getsockopt()`和`setsockopt()`函数用于获取和设置套接字选项,这些选项可以控制套接字的行为,例如设置超时时间、接收模式等。 - 选项级别包括应用层的`SOL_SOCKET`、传输层的`IPPROTO_TCP`、`IPPROTO_UDP`...
此外,为了调试和日志记录,可以使用`getsockopt`和`setsockopt`函数获取和设置套接字选项,如查看TCP连接状态,或者设置超时等。 总的来说,应用TCP/IP的套接字开发网络通信应用程序是一个涉及网络原理、Winsock ...
广播通信的实现通常需要设置套接字选项,比如`SO_BROADCAST`,允许套接字发送广播数据。 总结一下,数据报套接字实现广播涉及了UDP通信的基本操作,包括创建和绑定套接字,发送和接收数据报,以及设置广播功能。...
7. **套接字选项**:Socket类提供了setSoTimeout(int timeout)方法设置超时时间,防止因客户端无响应导致服务器端阻塞。此外,还有其他选项如禁用Nagle算法(setTcpNoDelay(true)),设置缓冲区大小等。 8. **实践...
6. **套接字选项和控制消息**:展示如何使用`setsockopt()`和`getsockopt()`函数设置和获取套接字选项,以及如何处理套接字控制消息(如SOCKS)。 7. **错误处理和调试**:提供关于如何在代码中添加日志和错误处理的...
// 设置套接字选项 int opt = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)); // 捕获IP数据包 char buffer[1024]; recv(sock, buffer, 1024, 0); // 解析IP数据包 IP...
本章主要探讨了这两种通信方式以及相关的套接字选项和I/O控制命令。 首先,广播通信是指网络层服务,它允许一个节点将数据包发送到同一个广播域内的所有其他节点。这种通信模式常用于设备发现、网络配置等场景,...
2. **设置套接字选项**:使用`setsockopt()`函数,通过IP_HDRINCL选项告诉内核我们希望在接收数据包时包含完整的IP头,而不是由内核处理。 3. **接收数据包**:使用`recvfrom()`函数接收数据包,获取完整的数据包,...
3. **套接字选项和控制消息**:讨论了如何使用getsockopt和setsockopt函数来获取和设置套接字选项,以及使用recvmsg和sendmsg函数处理控制消息。 4. **多路复用I/O**:介绍select、poll和epoll等机制,用于同时监控...
8.2.1 获取和设置套接字选项 8.2.2 通用套接字选项 本章小结 第三篇 应用提高篇 第九章 高级套接字函数编程实践 9.1 函数recv和send 9.1.1 函数send 9.1.2 函数recv 9.1.3 应用...
代码会包含定义套接字、设置套接字选项、进行错误处理等细节。例如,服务器端可能有一个循环不断接受新的连接,而客户端则可能在发送请求后等待服务器的回复。 值得注意的是,网络通信需要处理异步事件,如网络延迟...
此外,还有getsockopt()和setsockopt()用于获取和设置套接字选项,select()和poll()用于多路复用I/O。 四、网络地址和端口 在Unix网络编程中,网络地址通常表示为IP地址和端口号。IP地址标识网络上的主机,IPv4使用...
同时,作者介绍了如何正确处理网络编程中的错误,包括系统错误码、errno变量的使用,以及如何通过getsockopt和setsockopt函数来获取和设置套接字选项。 四、并发服务器设计 并发服务器是网络服务的基础,UNP提供了...
Redis提供了支持UNIX域套接字的选项,可以通过配置文件启用,并指定一个`.sock`文件,例如`redis.sock`。 在Java中,我们通常使用第三方库如Lettuce来操作Redis。Lettuce是一个强大的、线程安全的Redis客户端,支持...
8. **套接字选项**:`Socket`和`ServerSocket`类提供了若干选项,如设置超时、启用/禁用 Nagle 算法等,可以通过`setSoTimeout()`、`setTcpNoDelay()`等方法调整。 9. **阻塞与非阻塞模式**:默认情况下,套接字...
5. **错误处理**:如 `getsockopt()` 和 `setsockopt()` 用于获取和设置套接字选项,帮助调试和优化网络通信。 6. **多路复用I/O**:`select()` 和 `poll()` 允许程序同时监控多个套接字,等待数据可用或超时。 7....
- `getsockopt()`与`setsockopt()`:用于获取和设置与套接字相关的属性选项。 - `getsockname()`与`getpeername()`:获取本地和远程协议地址。 - **数据读取与发送**: - `bind()`:将本地名称与套接字绑定。 -...
7. **错误处理**:学习如何解析和处理Winsock返回的错误代码,以及使用`getsockopt`和`setsockopt`获取和设置套接字选项。 8. **关闭和清理**:正确使用`closesocket`关闭套接字,并通过`WSACleanup`来卸载Winsock...
- `getsockopt()` 和 `setsockopt()`:用于获取和设置套接字选项。 在使用这些函数时,需要注意错误处理,例如检查返回值是否为-1,以及使用`errno`变量获取错误代码。同时,根据网络编程需求,可能还需要处理并发...