首页 新闻 会员 周边 捐助

socket通信端口资源的释放问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-12-17 17:28

我把socket放在静态变量中,应用程序异常退出的时候socket实例没来得及dispose。

再开启应用程序的时候同一个端口就连不上了。

我觉得可能是端口被没有释放的socket占用着。

但这个时候静态变量中肯定是没有这个socket了,请问怎么把这个socket找出来,并消灭掉?

 

类似这种效果:

Invictus的主页 Invictus | 初学一级 | 园豆:76
提问于:2012-12-17 15:57
< >
分享
最佳答案
0

SOCKET端口会在一定时间(2分钟)没有使用后自动释放。同时,端口是随机分配,并不总会再你之前的端口上创建连接。

可能的原因是你的服务器只运行同一个客户端只有一个连接。

建议你使用 WSAGetLastError或 GetLastError查看一下连接失败的错误代码。

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2012-12-17 16:06

我是要用电脑做上位机访问一台设备的固定端口,所以端口是固定的。

有没有办法把socket端口马上释放掉?谢谢

Invictus | 园豆:76 (初学一级) | 2012-12-17 16:13

WSAGetLastError是在即时窗口中访问吗?

Invictus | 园豆:76 (初学一级) | 2012-12-17 16:15

电脑(上位机)相当于客户端,设备相当于服务端,实际上我做的只是客户端

Invictus | 园豆:76 (初学一级) | 2012-12-17 16:25

@Invictus: 再申明一次,端口是随机的,我假设服务器的端口如你图所示是:8000,客户端新建SOCKET后,客户端系统会为客户端分配 3467(此值是随机的,当然会略过一些系统保留端口和被占用的端口) 的端口用以和服务器的 8000 端口通信。

当你的应用程序退出后,端口 3467 会被保留一定时间(2分钟)而不被分配出去.

我现在假设端口 3467 被释放了,你再次新建SOCKET时,客户端系统会重新分配一个端口,新的端口号可能是 3467,也可能不是。

如果端口 3467 被占用,新的端口号就肯定不是 3467。

WSAGetLastError需要紧跟你的connect函数。

现在还没有办法可以主动按照端口号来释放端口,系统会自动回收没有进程占用的端口。

Launcher | 园豆:45050 (高人七级) | 2012-12-17 16:27

@Launcher:谢谢你。 客户端的端口应该是随机的,但只能访问服务端的8000端口,socket不释放的话,服务端8000端口被占用。可能这个设备(服务端)的最大连接数是 1 ?

Invictus | 园豆:76 (初学一级) | 2012-12-17 16:59

@Invictus: 我猜想服务端是限制了同一个客户端的连接数,这样才能重现你提到的客户端不释放连接,就没法再连接的问题,当然这需要通过测试来证实。你可以重启客户机后,启动2个客户端来测试。你还可以通过 netstat 来查看连接状态。

Launcher | 园豆:45050 (高人七级) | 2012-12-17 17:03

@Launcher: 高人,再请教一个多线程问题。http://q.cnblogs.com/q/44847/

Invictus | 园豆:76 (初学一级) | 2012-12-17 17:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册