使用 UdpClient,如何重试 UdpClient.Connect() 直到成功?

Using UdpClient, how do you retry UdpClient.Connect() until it succeeds?

我的 client/server 程序可以很好地相互配合,但只有当服务器启动并且 运行 我的客户端启动之前。如果客户端第一次连接失败,我无法让它重试。

这是我客户的 connect 方法。

public void connect()
    {          
        IPAddress server_address = IPAddress.Parse("127.0.0.1");
        IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
        Console.WriteLine("2");
        bool connected = false;
        while (!connected)
        {
            try
            {
                Console.WriteLine("IN CONNECTED");
                udp_client.Connect(server_ip);
                byte[] send_data = Encoding.ASCII.GetBytes("INIT");
                udp_client.Send(send_data, send_data.Length);
                byte[] received_bytes = udp_client.Receive(ref server_ip);
                string received_data = Encoding.ASCII.GetString(received_bytes);
                if (received_data == "INIT")
                {
                    connected = true;
                    Console.WriteLine("RECEIVED INIT");
                    listen(server_ip);
                }

            }

            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }

我希望看到的是 udp_client.Connect(server_ip) 循环,直到我收到来自服务器的 "INIT" 消息。

就目前而言,没有循环。它似乎卡在 udp_client.Receive(ref server_ip) 上。

如有任何帮助,我们将不胜感激!

这是伪代码 - 您必须将某些内容移动到 class 范围以允许将来 send/receives(您可以使用不同的方法)。这只是为了向您展示当连接阻塞时如何连接:

bool isClientConnected = false;
var connector = new System.ComponentModel.BackgroundWorker();

public void connectToUDP(){
    connector.DoWork+= connect;
    connector.RunWorkerAsync();
} 

 private void connect(object sender, DoWorkEventArgs e)
{          
    IPAddress server_address = IPAddress.Parse("127.0.0.1");
    IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
    Console.WriteLine("2");

                try
        {
            Console.WriteLine("Waiting for server...");
            udp_client.Connect(server_ip);
            byte[] send_data = Encoding.ASCII.GetBytes("INIT");
            udp_client.Send(send_data, send_data.Length);
            byte[] received_bytes = udp_client.Receive(ref server_ip);
            string received_data = Encoding.ASCII.GetString(received_bytes);
            if (received_data == "INIT")
            {
                isClietConnected = true;
                Console.WriteLine("now connected");
                listen(server_ip);
            }


        catch (Exception e)
        {
            Console.WriteLine(e);
        }

}
public bool sendReceiveUDP(string send){
     if(!isClientConnected){
          return false;
     }
     //perform send
     return true;
 }

然后您将使用 class 范围和 send/receive 使用不同的方法维护连接的会话。这仅用于连接,因为您只需要执行一次。

你是如何设置这样的东西的:

  private bool isConnected = false();
  private bool send(){
      if(!isConnected){
           connect();
      }
      //send
  }
  private bool connect(){
      if(!isConnected){
          //launch connection thread
      }
   }
  private delegate void onNewReceive(string message);
  public event onNewReceive onNewReceiveEvent;
  public void fireEvent(string message){
         onNewReceiveEvent.Invoke(message);
  }
       private void waitForData(object sender, DoWorkEventArgs e){
     //this is the backgroundworker
     while(true){
     receive();
     fireEvent(message);
     }
  }

然后,在另一个class中订阅onNewREceivedEvent 并处理入站消息。 onNewReceivedEvent += processInboundMEsasage();

这都是伪代码和 "brain compiled"(对其他人的贡献),因此它仅用于演示。没有智能感知,我迷路了。