SO_REUSEADDR 套接字选项:使两个server socket可以监听同一个端口
默认情况下,套接字不同一个正在使用的本地地址绑定到一起。但在少数情况下,仍有必要以这种方式,来实现对一个地址的重复利用。通过第7章的学习,大家已经知道,每个连接都是通过它的本地及远程地址的组合,“独一无二”地标识出来的。针对我们想要连接的地址,只要能用极其细微的差异(比如T C P / I P中采用不同的端口号),来维持这种“独一无二”或者“唯一”的特点,绑定便是允许的。唯一例外的是监听套接字。两个独立的套接字不可与同一个本地接口(在T C P / I P的情况下,则是端口)绑定到一起,以等待进入的连接通知。
假定两个套接字都在同一个端口上进行监听,那么到底由谁来接收一个进入连接通知呢?对于这个问题,目前尚无一种正式规范提出了解决方案。在T C P的环境下,假如服务器关闭,或异常退出,造成本地地址和端口均进入T I M E _ WA I T状态,那么S O _ R E U S E A D D R 这个套接字选项便显得非常有用。在T I M E _ WA I T状态下,其他任何套接字都不能与那个端口绑定到一起。但假若设置了该选项,服务器便可在重新启动之后,在相同的本地接口及端口上进行监听。
将服务端socket套接字设置上SO_REUSEADDR属性,代码如下:
//设置socket套接字的属性:允许多个设备在同一个本地网中监听同一下端口
int one = 1;
if (sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
{
printf("setsockopt SO_REUSEADDR error\n");
close(sock);
return;
}
这么设置套接字的作用是:允许两个server端的套接字在同一个本地网段中监听同一个端口.
分享到:
相关推荐
* SO_REUSEADDR:绑定套接字用到。套接字正常关闭或异常退出后的一段时间内,端口依然维持原来的绑定状态,设置此选项后避免。 * SO_TYPE:获取套接字的类型。SOCK_DGRAM、SOCK_STREAM… * SO_ACCEPTCONN:检测套接...
3. **参数option_name**:表示我们要设置的具体选项,如SO_DEBUG、SO_REUSEADDR等。 4. **参数option_value**:指向包含新选项值的缓冲区,根据option_name的值决定其含义。 5. **参数option_len**:表示option_...
- `SO_REUSEADDR`:启用或禁用地址复用,设置`sock->sk->sk_reuse`以允许在同一端口上快速绑定新套接字。 - `SO_DONTROUTE`:开启或关闭路由查找,通过设置`sock->sk->sk_flag`中的SOCK_LOCALROUTE标志。 - `SO_...
6. **套接字选项**:如SO_REUSEADDR、SO_LINGER等,这些选项可以调整socket的行为,sokit能帮助理解它们的作用。 7. **协议族与套接字类型**:如AF_INET(IPv4)、AF_INET6(IPv6)、SOCK_STREAM(TCP)、SOCK_...
- `SO_REUSEADDR`:允许重复使用本地地址和端口。 - `SO_TYPE`:获取套接字类型。 - `SO_BSDCOMPAT`:启用与BSD系统的兼容模式。 使用这些选项可以自定义套接字行为,适应不同的网络环境和应用需求。例如,`SO_...
Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。...
2. **更改内核参数**:除了在应用程序级别设置`SO_REUSEADDR`外,还可以通过修改内核参数来控制端口的重用行为。例如,可以通过调整`net.ipv4.tcp_tw_reuse`参数来允许更快地重用TIME_WAIT状态的端口。 ```bash # ...
1. **重用地址(SO_REUSEADDR)**:在调用`closesocket`后,Socket通常会进入TIME_WAIT状态,短时间内无法再次使用同一端口。通过设置`SO_REUSEADDR`为TRUE,可以允许新Socket立即重用该端口,避免等待TIME_WAIT的...
`SO_REUSEADDR`是Socket选项之一,允许一个Socket在地址处于TIME_WAIT状态时被重新绑定到相同的地址和端口。通常,在关闭一个Socket之后,其地址可能仍然处于TIME_WAIT状态,这会导致如果立即尝试重新绑定同一地址和...
`svr.task`和`clt.task`可能包含了服务器和客户端启动时所需的参数,如服务器的监听端口、客户端要连接的服务器地址等。这些任务文件可以是文本文件,用命令行工具读取并执行相应的操作。 总的来说,这个项目提供了...
例如,`SO_REUSEADDR`用于允许立即重用套接字地址,`SO_LINGER`用于控制断开连接时的行为,`TCP_NODELAY`用于禁用Nagle算法等。 4. `optval`: 指向选项值的指针,根据`optname`的不同,可能是一个整数、结构体或其他...
在Socket编程中,可以通过设置Socket选项来增强其功能,例如设置可重用地址选项(`SO_REUSEADDR`)以允许快速重启服务器。 ```c int re_use_addr = 1; int ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *...
#### 三、参数说明 1. **sockfd**:目标套接字的描述符。 2. **level**:指定选项所属的协议层或协议家族。如 `SOL_SOCKET` 表示该选项适用于所有类型的套接字。 3. **optname**:表示具体的选项名。 4. **optval**...
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(BOOL)); ``` 通过设置`SO_REUSEADDR`为`TRUE`,即使端口仍然处于TIME_WAIT状态,也可以重用同一个端口。 #### 2. 防止linger状态 在...
它同样调用 `socket()` 创建套接字,设置 `SO_REUSEADDR` 选项,然后使用 `bind()` 绑定本地地址,接着调用 `listen()` 开始监听,最后在循环中使用 `accept()` 接受连接。 这个简单的例子展示了如何在Linux下使用...
- **设置选项**:`setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))` 设置了套接字选项,使得服务器可以重用地址。 - **绑定地址**:`bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct ...
在这个话题中,我们将探讨几个关键的步骤和概念,包括`socket()`、`bind()`、`TIME_WAIT`状态以及`SO_REUSEADDR`选项。 首先,`socket()`函数用于创建一个socket,返回一个描述符,这个描述符就像文件描述符一样,...
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = ...
- 常用选项:SO_REUSEADDR、SO_KEEPALIVE等。 #### 五、总结 《Linux Socket编程示例》这本书详细介绍了Socket编程的基本概念和技术细节,并通过丰富的实例演示了如何在Linux系统上实现网络通信。无论是初学者...