关闭方法

时间:2016-07-02 16:41:40

标签: c# .net sockets shutdown

我有一个奇怪的问题。我有连接到服务器的客户端套接字应用程序(在PC上运行的客户端应用程序和在服务器上作为Windows服务运行的服在关闭服务器应用程序期间,每个打开的客户端套接字在服务器上调用此代码时出现问题:

socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket.Dispose();

代码运行时没有任何错误,应用程序已成功关闭,但在服务器应用程序关闭后,问题将立即出现在客户端应用程序中。

这是异步回调方法的代码,它由客户端上的BeginReceive方法注册:

private void ReadMachineServiceResponse(IAsyncResult ar)
{
    int bytesRead = 0;
    TcpServiceStateObject state = (TcpServiceStateObject)ar.AsyncState;
    Socket handler = state.WorkSocket;

    try
    {
        bytesRead = handler.EndReceive(ar);
    }
    catch (Exception ex)
    {
        bytesRead = 0;

        this.Dispatcher.Invoke((Action)(() =>
        {
            this.AddEventLogMessage(LogMessageType.Error, ex.Message, null, true, false);
        }));
    }

    try
    {
        if (bytesRead > 0)
        {
            //do some code...
        }

        state = new TcpServiceStateObject();
        this._machineServiceSocket.BeginReceive(state.Buffer, 0, state.BufferSize, 0, new AsyncCallback(this.ReadMachineServiceResponse), state);
    }
    catch (Exception ex)
    {
        //do some exception code
    }
}

关闭服务器应用程序后,会在一秒钟内多次调用方法ReadMachineServiceResponse,直到关闭客户端应用程序。在用户关闭客户端应用程序之前,它被调用了两天。我发现即使万一我将客户端计算机与网络断开连接,也会调用此方法 - 因此问题出在客户端。在关闭方法调用之后在客户端接收的消息为空 - 变量bytesRead = 0.套接字属性"已连接"仍然设置为true。客户端并不知道连接已关闭,因此不会抛出异常。

当我尝试评论line" socket.Shutdown(SocketShutdown.Both);"在服务器端然后一切正常。在客户端抛出异常,在服务器端关闭套接字后没有收到任何消息。

每次都会出现问题 - 无论客户端是连接到服务器几秒钟还是几天,以及客户端是否在服务器运行的开始和结束之间都从服务器收到一些消息都无关紧要。

在客户端计算机上的netstat中,我可以看到套接字处于CLOSE_WAIT状态。

谢谢你的每一个想法。我想知道这个问题的原因。

0 个答案:

没有答案