6

我正在尝试在两台计算机之间建立 UDP 通信链接。一台计算机正在运行客户端应用程序,另一台计算机正在运行服务器应用程序。客户端应用程序给出错误:

在执行此操作之前,您必须调用 Bind 方法。

下面是我为下面的客户端编写的代码,我已经评论了错误发生的位置:

 public delegate void ShowMessage(string message);
    UdpClient udpClient = new UdpClient();
    Int32 port = 11000;
    public ShowMessage myDelegate;
    Thread thread;


private void Form1_Load(object sender, EventArgs e)
    {
        thread = new Thread(new ThreadStart(ReceiveMessage));
        thread.IsBackground = true;
        thread.Start();
    }


    private void ReceiveMessage()
    {
        while (true)
        {
            IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, port);

            //Error on this line
            byte[] content = udpClient.Receive(ref remoteIPEndPoint);

            if (content.Length > 0)
            {
                string message = Encoding.ASCII.GetString(content);


                this.Invoke(myDelegate, new object[] { message });
            }

        }

    }

任何帮助将不胜感激。

来源-> http://lamahashim.blogspot.com/2009/06/using-c-udpclient-send-and-receive.html

4

4 回答 4

8

我相信你需要先调用Bind监听服务器:

udpServer.Client.Bind(new IPEndPoint(IPAddress.Any, 11000));
于 2012-07-27T15:06:41.817 回答
7

您需要告诉 udpclient 监听哪个端口。您传递接收方法的 IPEndpoint 可以设置为您喜欢的任何内容,因为它会填充发送者的详细信息。它不会指示 udpclient 侦听端口 11000。实际上,您正在尝试侦听端口 0,它指示 udpclient 选择它自己的端口。

看看http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.receive.aspx

您将看到使用要侦听的端口调用构造函数。

于 2012-07-27T15:47:31.190 回答
0

我遇到了这个问题并试图用 解决Bind,但是这种方法有一个限制:

  • 创建 后udpClient,您可以使用Bind来分配所需的IPEndPoint.
  • 当您尝试再次IPEndPoint将相同的udpClient后缀分配给其他时出现问题:它会出错。我想它会发生在您作为示例编写的代码中(因为循环)。要解决这种情况,您必须关闭 udpClient udpClient.Close()并再次生成, udpClient.new()然后您可以再次使用该Bind方法并分配一个新的IPEndPoint.

原因是该Bind方法仅适用于udpClient具有IPEndPoint=null

我希望它有所帮助。

于 2017-02-15T09:22:02.993 回答
-1

好吧..我没有做很多搜索..但我使用了它并且它有效:

UdpClientv4.Client.Connect(ipEndPointv4);

我使用 Connect 而不是 Bind。可能是 Connect 正在调用 Bind。

于 2018-05-10T19:01:29.213 回答