TCP客户端Socket如何立即释放端口?
|
发现连接数超某数时,及时清除不用套接字子线程,服务器与客户端均可设超时强制关闭
''及时清除不用的子线程。 Private Sub dogthread(ByVal Tzobj As System.Object, ByVal e As System.EventArgs) dogrunBZ(Tzobj) = True ''正在运行时,防止重复运行 Try mySocket(Tzobj).Shutdown(SocketShutdown.Receive) ''关闭套接字接收 ''mySocket(Tzobj).Shutdown(SocketShutdown.Both) ''组态王对此条支持不好 Catch End Try Try mySocket(Tzobj).Close() ''引发子线程立即异常,中断子线程循环 Catch End Try Try myThread(Tzobj).Abort() ''中止某个线程,销毁这些线程,需要很多时间! myThread(Tzobj).Join(300) ''等待300毫秒,超时也终止,防止不出来 Catch End Try Try mySocket(Tzobj) = Nothing ''防止组态王响应没那么快!!! Catch End Try GC.Collect() dogrunBZ(Tzobj) = False ''运行完毕标志 End Sub |
|
''及时清除不用的子线程。 Private Sub dogthread(ByVal Tzobj As System.Object, ByVal e As System.EventArgs) dogrunBZ(Tzobj) = True ''正在运行时,防止重复运行 Try mySocket(Tzobj).Shutdown(SocketShutdown.Receive) ''关闭套接字接收 ''mySocket(Tzobj).Shutdown(SocketShutdown.Both) ''组态王对此条支持不好 Catch End Try Try mySocket(Tzobj).Close() ''引发子线程立即异常,中断子线程循环 Catch End Try Try myThread(Tzobj).Abort() ''中止某个线程,销毁这些线程,需要很多时间! myThread(Tzobj).Join(300) ''等待300毫秒,超时也终止,防止不出来 Catch End Try Try mySocket(Tzobj) = Nothing ''防止组态王响应没那么快!!! Catch End Try GC.Collect() dogrunBZ(Tzobj) = False ''运行完毕标志 End Sub |
|
谢谢回复,真不是这么简单的事。你可以试试能不能在30s之内创建>65536个客户端连接。
|
|
我对tcp研究的不是那么深.. 请问你这个6W多连接 是长连接没有断开的?
不是吧 client的端口也没这么多.. 如果是ope send close dispose的话 感觉还差不多可以.. 否则这也不叫长连接了啊..... 难道你的意思 本地client使用了5000端口连接 然后这5000还可以个下一个client用? 不存在啊..那么你2个client 服务器如何找到客户端... |
|
TcpClient c = new TcpClient(); c.Connect(IPAddress.Parse("x"), o); c.Client.Send(by); c.Client.Shutdown(SocketShutdown.Both); c.Client.Close(); c.Close(); 这虽然是tcp_client但是发了就没了.....具体我还真没测试过..不知道我想的是不是跟你想的一样.. |
|
长连接就不是30s的问题了,短连接,用完立即Shutdown+Close,Dispose也是没用的。 我这里可以用到6W+端口,这个数量与范围也可以修改注册表。
测试中同时存在的client只有1024,也就是1024并发。 端口在Socket关闭之后是可以给其它Socket使用的,不过现在的问题就是要等待30s。 你在Close之后的30s内应该都能用netstat看到这个连接处于Close_Wait状态,并没有释放端口。 |
|
假设本地0-65536都可用
也就是
30s之内 这些port是不能重复使用的.. 假设在30s之内已经到了65535 就死掉了..但是理想中希望的是 前面的端口已经释放了 还可以用 是吧.. 这个还真没研究过..一般都是玩server.client哪有这么多啊.. 如果你只是要测试server的压力 我都用别人的软件测试并发. 如果自己写好像就是什么线程池吧.... 就是先建立连接不发..然后..一起发送... |
|
是这样的,压力测试工具都有这个问题。要么达不到这个吞吐量,要么需要管理员身份运行。 如果仅仅是自己用没有什么问题,但是作为一个Demo要以管理员身份运行,有点过分,不合适。
|
|
服务器端可以限制连接总数,超过总数的,拒绝连接即可,保持连接总数不超过mou值
|
|
没什么好办法。除非你自己使用 TcpClient 封装一个“http客户端”类(不用.net类库中现成的),重复使用本地端口、而不关闭。
|