在启动TCP服务器之前,如何优雅地启动C#TCP客户端

在启动TCP服务器之前,如何优雅地启动C#TCP客户端,c#,multithreading,sockets,tcp,C#,Multithreading,Sockets,Tcp,我正在编写一个相当简单的TCP/IP客户端应用程序。当我启动服务器(另一个独立的应用程序),然后按顺序启动客户机时,我能够成功连接。我想让客户端变得健壮,这样我就可以先启动它,而不会崩溃。另外,我不想让一个特殊的用户操作告诉客户端尝试连接。我还希望在客户机上使用非阻塞异步IO 为了尝试并实现这一点,我尝试使用Socket.BeginConnect方法。我的意图是,这个调用将产生一个后台线程,在建立连接之前,它将在EndConnect调用中被阻塞。这样,我的客户机可以在启动时调用此方法,然后继续操

我正在编写一个相当简单的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

有人能告诉我如何让这个异步连接等待服务器应用程序吗?提前谢谢

有人能告诉我如何让这个异步连接等待服务器吗 申请


没什么。每X秒循环运行一次,直到它启动或获得逻辑超时。TCP不会等待,您必须重试。

当代码第一次需要连接时,根据用户的操作让客户端按需连接即可。如果连接失败,告诉用户他还不能这样做,不管是什么。

我不久前写了一个异步TCP服务器的示例,它可能很有用: