SOCKET端口会在一定时间(2分钟)没有使用后自动释放。同时,端口是随机分配,并不总会再你之前的端口上创建连接。
可能的原因是你的服务器只运行同一个客户端只有一个连接。
建议你使用 WSAGetLastError或 GetLastError查看一下连接失败的错误代码。
我是要用电脑做上位机访问一台设备的固定端口,所以端口是固定的。
有没有办法把socket端口马上释放掉?谢谢
WSAGetLastError是在即时窗口中访问吗?
电脑(上位机)相当于客户端,设备相当于服务端,实际上我做的只是客户端
@Invictus: 再申明一次,端口是随机的,我假设服务器的端口如你图所示是:8000,客户端新建SOCKET后,客户端系统会为客户端分配 3467(此值是随机的,当然会略过一些系统保留端口和被占用的端口) 的端口用以和服务器的 8000 端口通信。
当你的应用程序退出后,端口 3467 会被保留一定时间(2分钟)而不被分配出去.
我现在假设端口 3467 被释放了,你再次新建SOCKET时,客户端系统会重新分配一个端口,新的端口号可能是 3467,也可能不是。
如果端口 3467 被占用,新的端口号就肯定不是 3467。
WSAGetLastError需要紧跟你的connect函数。
现在还没有办法可以主动按照端口号来释放端口,系统会自动回收没有进程占用的端口。
@Launcher:谢谢你。 客户端的端口应该是随机的,但只能访问服务端的8000端口,socket不释放的话,服务端8000端口被占用。可能这个设备(服务端)的最大连接数是 1 ?
@Invictus: 我猜想服务端是限制了同一个客户端的连接数,这样才能重现你提到的客户端不释放连接,就没法再连接的问题,当然这需要通过测试来证实。你可以重启客户机后,启动2个客户端来测试。你还可以通过 netstat 来查看连接状态。
@Launcher: 高人,再请教一个多线程问题。http://q.cnblogs.com/q/44847/