如何修改TIME_WAIT状态的维持时间?

VCSQLVB 2008-11-27 12:10:56
我做服务端发现:
当客户连接超时后,服务端主动使用TransmitFile关闭连接时出现阻塞,查看MSDN发现是因为TCP处于TIME_WAIT状态引起的,阻塞大概持续240秒(windows默认的吧),大家知道怎样修改吗,让TIME_WAIT等待时间减小.

谢谢!
...全文
3253 39 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
nsdcnsdc 2008-12-15
  • 打赏
  • 举报
回复
SOCKET s;
int timeOut = 1000;
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeOut, sizeof(timeOut));
TransmitFile(s, hFile,……
Derekfan 2008-12-10
  • 打赏
  • 举报
回复
學習了
simplebird 2008-12-02
  • 打赏
  • 举报
回复
这个问题当年我在csdn也问过,也没有满意的答复。
VCSQLVB 2008-12-01
  • 打赏
  • 举报
回复
始终还是觉得修改系统的东西不保险.
VCSQLVB 2008-12-01
  • 打赏
  • 举报
回复
确实没办法也只有使用closesocket了,然后另外创建新的socket.
dandelionl 2008-12-01
  • 打赏
  • 举报
回复
收藏
zidane_yubo 2008-12-01
  • 打赏
  • 举报
回复
学习了
derelictangel 2008-12-01
  • 打赏
  • 举报
回复
慢慢学习

PS:
我的目标是 ---->

^_^
weichen2005 2008-12-01
  • 打赏
  • 举报
回复
d
Eleven 2008-11-30
  • 打赏
  • 举报
回复
学习了,Up
blackeyhsi 2008-11-30
  • 打赏
  • 举报
回复
学习了
lzh9955 2008-11-29
  • 打赏
  • 举报
回复
up
僵哥 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 gzlucky 的回复:]
又是TIME WAIT的问题,在多年前我也碰到过,好象的确没有什么好解决的方法。

不过从你的情况来看,应该不是TIME WAIT的问题,而是 FIN-WAIT的问题。你可以在发生此情况时,用netstat -n来查看你这条连接的情况。通常TIME-WAIT只影响到,此连接双方的端口的再使用。

其实碰到对方故障,直接关掉此socket就行了,无需理会其关闭过程是否有问题。不过在后台的TCP/IP中会看到此连接一直异常,直接对方断线,或把此Socket 关掉…
[/Quote]
TIME_WAIT是正常的,这个主要是为了数据的安全起见,防止窜包。而FIN_WAIT,CLOSE_WAIT则属于异常状态。
僵哥 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 WinEggDrop 的回复:]
引用 2 楼 unsigned 的回复:
INIFile codeWindows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"MaxUserPort"=dword:0000fffe
"TcpTimedWaitDelay"=dword:00000005


0x1E 0x12C ( 30–300 seconds)

5秒肯定不被接受,估计又会重置为240秒
[/Quote]
早先的时候MSDN并没有限制范围。不过新系统当中这似乎又不是太过重要(XP/VISTA等个人或工作站可能是个例外)

To prevent an application from creating a connection with the same set of socket addresses of a connection that is in a TIME-WAIT state, TCP/IP in Windows Server 2003 Service Pack 1 has implemented a smart TCP port allocation algorithm. When an application requests any available TCP port, TCP/IP first attempts to find an available port that does not correspond to a connection in the TIME-WAIT state. If a port cannot be found, then it picks any available port.
This new behavior makes it much more unlikely that an application will be assigned a TCP port that is in the TIME-WAIT state when connecting to the same destination. You no longer need to modify the TcpTimedWaitDelay registry entry.
yhy0611 2008-11-29
  • 打赏
  • 举报
回复
好像没有人知道怎么改呀
rightyeah 2008-11-29
  • 打赏
  • 举报
回复
up
itymx 2008-11-29
  • 打赏
  • 举报
回复
顶 顶 顶 顶 顶 顶 顶 顶 顶 建了个群 欢迎加入 群号:52993264
gzlucky 2008-11-29
  • 打赏
  • 举报
回复
又是TIME WAIT的问题,在多年前我也碰到过,好象的确没有什么好解决的方法。

不过从你的情况来看,应该不是TIME WAIT的问题,而是 FIN-WAIT的问题。你可以在发生此情况时,用netstat -n来查看你这条连接的情况。通常TIME-WAIT只影响到,此连接双方的端口的再使用。

其实碰到对方故障,直接关掉此socket就行了,无需理会其关闭过程是否有问题。不过在后台的TCP/IP中会看到此连接一直异常,直接对方断线,或把此Socket 关掉,有时候可能甚至对方断网了,还一直留着。

一个TCP连接,如果自己关闭了连接,而对方没有关闭,本方会看到FIN-WAIT,而对方的机器会看到CLOSE-WAIT。如果双方都成功关闭连接后,才会有TIME-WAIT。我说得还是比较粗略,简化了TCP连接关闭的过程,如果有兴趣,可以上网查看各个状态的描述,不过就是很容易给看晕。

我曾查看TIME-WAIT的解释,是用以防止此链路上还有数据未在中间的路由交换上传递完毕,所以在连接断开后一定时间内,仍保持状态,以让所有的路由交换都能真正确认连接要关闭,并不再传递当中的信息。
Huangyifei 2008-11-29
  • 打赏
  • 举报
回复
Down
gellf 2008-11-29
  • 打赏
  • 举报
回复
试下


struct linger {
u_short l_onoff;
u_short l_linger;
}


struct linger linger = { 1, 30};

setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger));
加载更多回复(18)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧