======如何真正关闭ClientSocket控件与服务器连接的端口!======

highbury 2004-01-07 06:37:43
现有一TClientSocket控件,与服务器保持一个长连接。
介面上有一个“启动”按钮,“停止”按钮。分别是开启这个与服务器的长连接和关闭该长连接。

我在“停止”按钮的事件里是这样关闭长连接的:ClientSocket.close;
当我使用 netstat -na 命令观看系统端口情况时,发现有一个本地断口开者,只是它的状态为 Time_Wait. 当我点好多次“启动”和“停止”按钮后,发现有一堆的本地断口,状态都是Time_Wait.

当过去一段时间后,再次查看这些本地断口的状态,发现状态变成了Fin_Wait_2

再过去一段时间后,再次查这些本地断口的状态,发现这些断口已经全部消失,就是已经 被系统关闭了。

请教一下用ClientSocket.close方法不能真正关闭本地断口吗?
...全文
233 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Maxwell 2004-01-31
  • 打赏
  • 举报
回复
断开连接不是可以先等待对方把数据全传送完之后再断开吗,我忘记应该怎么写了,手头没有资料。那样不知道行不行。
一个端口断开要等待两倍超时时间的,只是不知道数据传输完了还用不用等。

我用TTcpServer 监听端口的时候也有类似的毛病,但是换成TServerSocket 就能立刻断开。
http://expert.csdn.net/Expert/TopicView1.asp?id=2679010

你也可以考虑换个控件试试。
mingtom 2004-01-30
  • 打赏
  • 举报
回复
to: chard()
没有办法解决了吗?
chard 2004-01-30
  • 打赏
  • 举报
回复
tcp/ip本来就是这样,当你在关闭一个socket连接时用netstat -na查看就是Time_Wait.它需要过一段时间后才会自动释放,你可以写一个连接sybase的数据库程序,然后用netstat查看端口情况,其结果也是一样
mentalpatient 2004-01-29
  • 打赏
  • 举报
回复
把你的代码贴出来
mingtom 2004-01-29
  • 打赏
  • 举报
回复
to : mentalpatient(按时吃药)
今天试了一下。
我用的是 indy 的 TIdTCPClient
IdTCPClient1.Socket 里面好象没有Disconnect 这一项
Socket.Close 好象也不行
Socket.Destroy 也不行
怎么办呢?
mingtom 2004-01-29
  • 打赏
  • 举报
回复
就是在点际关闭的时候
IdTCPClient1.DisConnect;
IdTCPClient1.Free;
mingtom 2004-01-21
  • 打赏
  • 举报
回复
新年快乐!!
我初八上班后试一下。
如果可行,我决不食言。
谢谢大家!
mentalpatient 2004-01-20
  • 打赏
  • 举报
回复
呵呵 我好象解决了。

在关闭时加一句话ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
这样就能把端口释放了。

别忘了给分!
yoyoung 2004-01-19
  • 打赏
  • 举报
回复
试一下Socket.close来关闭
mingtom 2004-01-18
  • 打赏
  • 举报
回复
up
mingtom 2004-01-17
  • 打赏
  • 举报
回复
我今天作过试验了:

若服务器主动关闭,则客户端相应端口的占用会被马上释放。
反之,若客户端主动关闭,则客户端相应端口的占用不会被马上释放,相应端口的状态为“TIME_WAIT”。

总不能要求人家服务器端在客户端关闭连接后也关闭一下连接吧。

若解决此问题,我另外开帖送分-100 决不食言。
本人有的是分。
koy0755 2004-01-17
  • 打赏
  • 举报
回复
我也遇到这种问题Tidtcpclient设置了boundpost,退出程序后端口不会立即释放。
mingtom 2004-01-16
  • 打赏
  • 举报
回复
TIdTCPClient.Free ;

好象这样也不行哎!
zheng33 2004-01-14
  • 打赏
  • 举报
回复
释放WINSOCKEY的创建。
mingtom 2004-01-14
  • 打赏
  • 举报
回复
to: highbury()
抱歉,我暂时也找不到解决的办法。
看来只有另外分配端口了!
mentalpatient 2004-01-12
  • 打赏
  • 举报
回复
好象不能,我也见过这样的问题。

每次ClientSocket1.open都会打开一个端口,状态为LISTENING。之后ClientSocket1.Close端口还在,以后每OPEN一次都会再打开一个端口。
highbury 2004-01-10
  • 打赏
  • 举报
回复
mingtom():
有没有什么 解决方法?
急啊,老没人回答
mingtom 2004-01-09
  • 打赏
  • 举报
回复
up
在 TIdTCPClient 里面也有这个问题。
highbury 2004-01-08
  • 打赏
  • 举报
回复
有人研究过 吗?
help!!
highbury 2004-01-08
  • 打赏
  • 举报
回复
再顶啊
加载更多回复(2)

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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