【问题标题】:How can I gracefully start my C# TCP client before I start my TCP server在启动 TCP 服务器之前,如何优雅地启动我的 C# TCP 客户端
【发布时间】:2014-04-14 18:53:10
【问题描述】:

我正在编写一个相当简单的 TCP/IP 客户端应用程序。当我启动服务器(另一个单独的应用程序)然后按该顺序启动客户端时,我能够成功连接。我想让客户端变得健壮,以便我可以先启动它并且它不会中断。此外,我不想要一个特殊的用户操作来告诉客户端尝试连接。我还想在客户端使用非阻塞异步 IO。

为了尝试并完成此操作,我尝试使用 Socket.BeginConnect 方法。我的意图是该调用将产生一个后台线程,该线程将在 EndConnect 调用中被阻塞,直到建立连接。这样我的客户可以在启动时调用此方法,然后继续操作。这是我的代码:

public bool Init_Port(string Host)
    {
        IPHostEntry ipHostInfo = Dns.Resolve(Host);
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, PORT);

        try
        {
            //Create the connection
            My_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            My_Socket.BeginConnect(localEndPoint, new AsyncCallback(Connect_To_Port), My_Socket);

        }
        catch (Exception e)
        {
            ErrorHandler(e.Message);
            return false;
        }
        return true;
    }

    private void Connect_To_Port(IAsyncResult ar)
    {
        try
        {
            if (My_Socket != null)
            {
                //will block the thread until a connection is made
                My_Socket.EndConnect(ar);

                Connection_Flag = true;

                //Setup the asynchronous read
                My_Socket.BeginReceive(Rx_Buffer, 0, SOCKET_BUFFER_SIZE, 0,
                                                new AsyncCallback(Read_Port), My_Socket );
            }
        }
        catch (Exception e)
        {
            ErrorHandler(e.Message);
        }
    }

我在没有启动服务器应用程序的情况下对此进行了测试。我希望线程将在 EndConnect 处被阻塞,直到我的服务器应用程序启动。我观察到的是 EndConnect 立即返回并且我收到错误消息

无法建立连接,因为目标机器主动拒绝它 127.0.0.1:50042

谁能告诉我我可以做些什么来让这个异步连接等待服务器应用程序?提前致谢。

【问题讨论】:

标签: c# multithreading sockets tcp


【解决方案1】:

谁能告诉我我能做些什么来让这个异步连接等待服务器 申请?

什么都没有。你每隔 X 秒循环运行一次,直到它开始或者你得到一个逻辑超时。 TCP 不会等待,您必须重试。

【讨论】:

    【解决方案2】:

    只需让客户端按需连接,当代码首先需要连接时,根据用户正在执行的操作。如果连接失败,告诉用户他还不能这样做,不管它是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多