关闭异步连接

3
我已经在C#中创建了一个异步服务器,以配合我的Android应用程序。该服务器类似于这个链接:http://msdn.microsoft.com/en-us/library/fx6588te.aspx
它能很好地工作,并且我可以让许多客户端同时连接并从服务器接收数据。但是我发现一个问题,如果在Android应用程序中已经通过Wifi连接并再次按下连接按钮,则服务器会生成一个新的套接字。服务器应该先关闭旧连接,然后创建新连接。在Android端,我确保调用close(),甚至将其设置为null。我还向服务器发送断开控制信号,以便它也可以在套接字上调用close()。例如,以下是我在服务器中执行此操作的方式:
if (state.storage.parseJson(content) == JsonStorage.DISCONNECT)
{
    Console.WriteLine("Disconnect2!");
    state.workSocket.Shutdown(SocketShutdown.Both);
    state.workSocket.Close();
    return;
}

当我在一个叫做“CurrPorts”的程序中检查我的服务器进程时,它显示有几个连接打开到不同端口的Android设备。我使用Timer对象向客户端发送数据,并检查连接是否活动,否则我会关闭它。例如,我的TimerCallback方法:

public void TimeCallBack(object input)
{
    StateObject state = (StateObject)input;
    if (state.workSocket.Connected)
    {
        Send(state.workSocket, state.storage.getJson());
    }
    else
    {
        Console.WriteLine("Dispose!");
        state.timer.Dispose();
        state.workSocket.Close();
    }
}

我想不出为什么我的服务器没有关闭旧连接。打开的连接数应该与连接到服务器的设备数量相同。如果这是一个线程阻塞的服务器,那么只需关闭线程即可,但在这种情况下我不确定该怎么做。
编辑:所以我让CurrPorts程序放置一段时间后刷新了一下,已建立的连接数减少到了一个。我的解决方案对吗?只是Windows需要一段时间才能清除创建的旧套接字连接?
1个回答

1

是的,Windows会在一段时间内保留有关套接字的信息。您可以通过netstat查看此信息,关闭的套接字将显示为TIME_WAIT状态,即使托管套接字的应用程序已终止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接