【问题标题】:Stop a Asyncronous TCP Application Properly正确停止异步 TCP 应用程序
【发布时间】:2010-10-13 08:06:52
【问题描述】:

嗨,我的 SERVER 应用程序中有一个断开按钮单击事件,如下所示。在它 dc 之前,它会通过发送“/exit”命令来提醒其他客户端。之后它将关闭其连接。

 private void stopButton_Click(object sender, EventArgs e)
    {
        byte[] exit_command = Encoding.ASCII.GetBytes("/exit");
        g_server_conn.BeginSend(exit_command, 0, exit_command.Length, SocketFlags.None, new AsyncCallback(Send), g_server_conn);
        g_server_conn.Shutdown(SocketShutdown.Both);
        g_server_conn.Close();
    }

问题是服务器一直在执行 Socket.BeginRecieve() 方法。我们如何告诉 begin recieve 方法停止它的操作,以便我可以正常关闭。

私人无效接受(IAsyncResult iar) {

        Socket winsock = (Socket)iar.AsyncState;
        g_server_conn = winsock.EndAccept(iar);


        //Function that exchanges names of each other
        NewClient(g_server_conn);

        Socket server_conn = g_server_conn;

        chat_msg = new byte[1024];
        server_conn.BeginReceive(chat_msg, 0, chat_msg.Length, SocketFlags.None, new AsyncCallback(Recieve), server_conn);

    }

    private void Recieve(IAsyncResult iar)
    {
        Socket server_conn = (Socket)iar.AsyncState;
        server_conn.EndReceive(iar);

        //If clients shutdown connection,Server recieves /exit command
        if (Encoding.ASCII.GetString(chat_msg, 0, chat_msg.Length) == "/exit")
        {
            g_server_conn.Shutdown(SocketShutdown.Both);
            g_server_conn.Close();
            return;
        }
        SetLabel(client_name, chatListBox);
        SetLabel(Encoding.ASCII.GetString(chat_msg), chatListBox);

        chat_msg = new byte[1024];
        server_conn.BeginReceive(chat_msg, 0, chat_msg.Length, SocketFlags.None, new AsyncCallback(Recieve), server_conn);


    }

【问题讨论】:

    标签: c# tcp shutdown


    【解决方案1】:

    您应该使用BeginXXX 方法返回的IAsyncResult。 IIRC,你可以处理掉WaitHandle

    【讨论】:

      【解决方案2】:

      客户端是否真的需要知道服务器关闭连接的原因(您似乎发送了一条没有任何原因信息的断开连接消息,)?您似乎只是向客户端发送了一条额外消息以断开它们的连接。

      您可以断开所有客户端,它们将收到关闭套接字消息,这将在客户端显示连接正在关闭。

      顺便说一句,将接收到的字符串转换这么多次是没有意义的,将它从​​字节数组转换为字符串一次就完成了:)。

      我个人的顺序是:
      1)设置一个全局布尔值,我们不再接受新客户端(如果新客户端尝试在这个时间连接,我不会接受它)
      2)查看客户端列表并断开它们
      3)关闭lister。

      【讨论】:

        猜你喜欢
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多