TIME_WAIT发生在主动关闭的一端,一般是服务器,当服务器主动关闭后,如果想再次绑定相同的端口号,会出现Address already in use的提示。
我们写一个程序,让服务器发送给客户端信息后主动关闭(注意发送信息不是必须的,只要连接建立即可),然后在客户端执行close之前打印TIME_WAIT开始的时间(注意这里靠前一点,所有测试结果有时候会多1秒),服务器紧接着创建socket并进行绑定,绑定出错则睡眠1s,直到绑定成功,打印绑定成功的时间,错误过程中一直显示睡眠了多少秒。
程序中使用无名管道作为同步方式。
我测试结果如下:
dinghuaneng@DC:~/net$ gcc -o check_timewait check_timewait.c -Wall
dinghuaneng@DC:~/net$ ./check_timewait
bind ok, time: Sun Jul 15 10:50:21 2012
pipe read:CO
connection from 127.0.0.1:56532
Write 24 bytes
Rcv 24 bytes: Sun Jul 15 10:50:21 2012
pipe read:CL
TIME_WAIT start time:Sun Jul 15 10:50:21 2012
Error bind: 60
bind ok, time: Sun Jul 15 10:51:21 2012
代码附上:
#include "global.h"
int main(int argc, char **argv)
{
int listenfd, connfd;
int pfd[2];
int n;
socklen_t len;
char buff[128];
char pbuf[4];
struct sockaddr_in servaddr, cliaddr;
time_t ticks;
bzero(&servaddr, sizeof servaddr);
bzero(&cliaddr, sizeof cliaddr);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == listenfd) {
perror("Error socket");
return -1;
}
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8888);
if (-1 == pipe(pfd)) {
perror("Error pipe");
return -1;
}
if (fork() == 0) {
close(pfd[1]);
connfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == connfd) {
perror("Error socket");
return -1;
}
read(pfd[0], pbuf, 3);
printf("pipe read:%s\n", pbuf);
if (-1 == connect(connfd, (struct sockaddr*)&servaddr, sizeof servaddr)) {
perror("Error connect");
return -1;
}
int n = read(connfd, buff, sizeof buff);
if (n == -1) {
perror("Error read");
return -1;
}
buff[n] = 0;
printf("Rcv %d bytes: %s\n", n, buff);
read(pfd[0], pbuf, 3);
printf("pipe read:%s\n", pbuf);
ticks = time(NULL);
printf("TIME_WAIT start time:%.24s\n", ctime(&ticks));
close(connfd);
close(pfd[0]);
exit(0);
}
close(pfd[0]);
if (-1 == bind(listenfd, (struct sockaddr*)&servaddr, sizeof servaddr)) {
perror("Error bind");
return -1;
}
ticks = time(NULL);
printf("bind ok, time: %.24s\n", ctime(&ticks));
if (-1 == listen(listenfd, 5)) {
perror("Error listen");
return -1;
}
write(pfd[1], "CO", 3);
for (;;) {
len = sizeof cliaddr;
connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len);
if (-1 == connfd) {
perror("Error accept");
sleep(1);
continue;
}
printf("connection from %s:%d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof buff),
ntohs(cliaddr.sin_port));
ticks = time(NULL);
snprintf(buff, sizeof buff, "%.24s", ctime(&ticks));
n = write(connfd, buff, strlen(buff));
printf("Write %d bytes\n", n);
close(connfd);
write(pfd[1], "CL", 3);
close(pfd[1]);
break;
}
close(listenfd);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == listenfd) {
perror("Error socket");
return -1;
}
int sn = 0;
while (-1 == bind(listenfd, (struct sockaddr*)&servaddr, sizeof servaddr)) {
printf("Error bind: %02d\r", ++sn);
fflush(stdout);
sleep(1);
continue;
}
printf("\n");
ticks = time(NULL);
printf("bind ok, time: %.24s\n", ctime(&ticks));
close(listenfd);
return 0;
}
分享到:
相关推荐
2. `net.ipv4.tcp_keepalive_time`:设置TCP保持活动的时间间隔,从2小时改为300秒,这样可以更快地检测到未响应的连接。 3. `net.ipv4.tcp_orphan_retries`:孤儿连接重试次数,减少不必要的资源占用。 4. `...
4. **长时间无数据交换**:如果服务器在CLOSE_WAIT状态下长时间没有与客户端交互,可能导致连接占用资源过多。 **解决CLOSE_WAIT错误的策略** 1. **优化代码**:确保服务器端的程序在接收FIN标志后,及时发送FIN...
1. 调整TCP连接超时设置:增加TIME_WAIT和CLOSE_WAIT状态的超时时间,允许服务器有更多时间处理剩余的数据。 2. 优化应用程序:确保程序在完成数据传输后立即关闭连接。 3. 监控和限制并发连接:设置上限以防止过多...
MySQL的`wait_timeout`连接超时问题通常出现在长时间无操作的数据库连接上,服务器会自动关闭这些连接以释放资源。这种现象在应用中可能导致突然的数据通信中断,表现为“Communications link failure”等错误,提示...
在MySQL数据库操作中,"SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded" 是一个常见的错误,它意味着在执行事务时,系统等待锁定资源的时间超过了预设的限制。这个错误通常发生在并发环境中,当...
print(f'游乐设施:{ride["name"]},等待时间:{ride["wait_time"]}分钟') ``` 【可视化展示】 为了使信息更加直观,我们还可以将这些数据进一步加工,使用Python的matplotlib或seaborn库进行数据可视化。绘制条形...
MySQL数据库的连接超时问题,通常表现为Wait_timeout错误,指的是当客户端与服务器之间的连接在指定时间内没有进行任何数据交互,数据库会自动断开这个连接,以释放资源并防止不必要的资源占用。这一特性在MySQL中是...
关于8255单片机的程序设计 ;变量声明区 SECOND EQU 30H ;秒 MINUTE EQU 31H ;分 HOUR EQU 32H ;时 DAY EQU 33H ;日 MONTH EQU 34H ;月 YEAR_L EQU 35H ;年低位 YEAR_H EQU 36H ;年高位 ...
2. **连接状态**:TCP连接有多种状态,如CLOSED、LISTEN、SYN_SENT、SYN_RECV、ESTABLISHED、FIN_WAIT1、FIN_WAIT2、CLOSE_WAIT、CLOSING、LAST_ACK和TIME_WAIT。理解这些状态有助于排查网络问题。 3. **TCP套接字...
基于汇编的完整点钞机程序 ;PCON EQU 87H ; 电源控制寄存器 T2CON EQU 0C8H RCAP2L EQU 0CAH RCAP2H EQU 0CBH TL2 EQU 0CDH ET2 EQU 0CCH TH2 EQU 0ADH ; 定时器2中断允许位 TF2 ...
4. **异常检测**:识别不正常的连接状态,如长时间的CLOSE_WAIT或FIN_WAIT_2,提示可能存在的问题。 5. **日志记录**:保存和分析连接历史,便于故障排查。 6. **配置管理**:允许用户自定义TCP参数,如超时时间、重...
客户端收到FIN后回应一个ACK,然后自身也发送FIN,服务器再次回应ACK,最后等待一段时间(TIME_WAIT状态)确保所有数据都被接收后,关闭连接。 以上就是TCP服务器端接收数据的基本流程和关键技术点。在实际编程中,...
- `wait_event_interruptible()`, `wait_event_timeout()`, `wait_event_interruptible_timeout()`: 提供了更多选项,如可中断等待、设置超时时间等。 ##### 3. 唤醒等待进程 - `wake_up(struct wait_queue **q)`, ...
- **解决方法**:可以通过调整系统的TIME_WAIT超时时间(通常设置为2MSL),或者使用SO_REUSEADDR选项来重用TIME_WAIT状态的地址。 **2. TCP与UDP的区别及应用场景** - **TCP**:传输控制协议是一种面向连接、可靠...
- **startup_time**: 实例启动的时间。 - **status**: 实例的状态(例如OPEN)。 - **database_status**: 数据库的状态(如ACTIVE),表示数据库是否可被用户访问。 #### 1.2. 查看Oracle日志文件状态 ```sql ...
- `net.ipv4.tcp_keepalive_time=180`:设置保持连接检查间隔,确保长时间无活动连接能够被及时检测到。 - `net.ipv4.tcp_max_tw_buckets=5000`:限制TIME_WAIT sockets的最大数量,防止内存泄露。 此外,还应适当...
1. 连接状态:监控TCP连接的状态,包括LISTEN(监听)、SYN_SENT(已发送SYN)、SYN_RECV(已接收SYN)、ESTABLISHED(已建立)、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、TIME_WAIT等。这些状态有...
在上述过程中,需要注意的是,当客户端处于`TIME_WAIT`状态时,它不会立即释放连接,而是需要等待一段时间(通常是2倍的最大段生命周期,即2MSL),这是为了确保服务器端能够正确地接收到客户端发送的最后一个ACK包...
客户端收到服务器的FIN后,发送ACK,进入TIME_WAIT状态,等待一段时间确保所有数据都被服务器接收,然后完全关闭连接。 TCP/IP协议的这些机制保证了网络通信的可靠性,使得数据可以在复杂和不可预测的网络环境中...