现在有个项目,使用socke建立连接,对方服务器限制了单个ip只能有一个连接,所以每次使用完后我会调用Shutdown(SocketShutdown.Both)以及Close关闭,但是调用此方法后重新调用connect方法,发现就无法连接了,可能对方限制了多个连接,唯一的办法就是调用Exit(0)完全退出进程重新启动后connect方法才能连接成功。所以怀疑是socket在调用close方法后并没有立刻回收资源,导致连接并没有断掉,只能完全退出的方式才能释放。这里想问一下还有没有什么别的方法?GC.collect没用

解决方案 »

  1.   

    Socket之间通信,是基于协议的,协议并非代码层面能够解释的东西。包含诸多逻辑。
    比如,握手-连接等。当你关闭的时候,你关闭的是你所运行的CLR上的一个对象,
    而对方服务器,并不知道。你需要在释放你的Socket之间,发送你们之间通信协议的关闭请求,
    并让其处理,在线程池中清除了和你的连接。比如:
    在关闭前,发":CLOSE"指令到对方Socket,
    对方Socket在收到后,就开始清理和你的连接相关的资源。
    这些都是CLR管理之外的,不是GC能处理的。
    所以和GC并无关系。所以,建议去摸清楚和对方通信的协议。这样才能有效地进行交互。