UDP 端口无法接收数据

Posted

技术标签:

【中文标题】UDP 端口无法接收数据【英文标题】:UDP Port Cannot Receive Data 【发布时间】:2017-12-24 15:41:33 【问题描述】:

我正在尝试通过 UDP 端口接收和发送数据。它与 TCP 配合得很好,但是当我将其更改为 UDP 时,它会损坏。

这是我仅用于接收的 UDP 代码:

Socket receiver_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.11.254"), 11000);
.
.
.
public Form1()

    InitializeComponent(); 
    receiver_socket.Connect(ipep);         


private void Receive_socket_delegate()

    receiver_socket.BeginReceive(r_buff, 0, r_buff.Length, SocketFlags.None, new AsyncCallback(socket_receive_data), receiver_socket);


void socket_receive_data(IAsyncResult iar)

    Socket remote = (Socket)iar.AsyncState;
    int recv = remote.EndReceive(iar);
    if (recv > 0)
    ...
    
   

怎么了?

【问题讨论】:

你不需要用UDP中的方法连接。你有什么问题请详细解释。 TCP 端口存在一个严重问题,迫使我改用 UDP。在 TCP 的情况下,如果你的数据超过了数据包的容量,它会不停地发送数据,所以其中会有一些不正确的数据。但是,这个问题不在 UDP 中。我的意思是如果某些数据超过了数据包的容量,它将忽略额外的数据。所以我想用它 它适合你吗? “TCP 端口有一个可怕的问题”——不,没有。 “会有一些不正确的数据” -- 不,不会有。您需要接受这样一个事实,即如果您在使用 TCP 时获得了不正确的数据,那么错误就在 您的 代码中,而不是在 TCP 中。至于您的问题,如果没有可靠地重现问题的良好minimal reproducible example,就无法回答。即使有一个,最可能的答案是您有网络配置问题。 【参考方案1】:

UDP是非绑定协议,不需要receiver_socket.Connect();。还有 UDPClient 对象用于 UDP 通信。

UdpClient listener = new Udpclient();
//Socket receiver_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.11.254"), 11000);
.
.
.
public Form1()

    InitializeComponent(); 
    //receiver_socket.Connect(ipep);
    Thread listeningthread = new Thread(Receive_socket_delegate);
    listeningthread.Start();         


private void Receive_socket_delegate()

   // receiver_socket.BeginReceive(r_buff, 0, r_buff.Length, SocketFlags.None, new AsyncCallback(socket_receive_data), receiver_socket);
    while(true)
    
    byte[] bytes = listener.Receive(ref ipep);
    ThreadPool.QueueUserWorkItem(state=>
    socket_receive_data(bytes);
    );
    


void socket_receive_data(byte[] bytes)

    // Write or use your data in here "bytes"
    if (recv > 0)
    ...
    
   

【讨论】:

谢谢,但出现错误:System.dll 中发生“System.InvalidOperationException”类型的未处理异常附加信息:您必须在执行此操作之前调用 Bind 方法

以上是关于UDP 端口无法接收数据的主要内容,如果未能解决你的问题,请参考以下文章

我用udp发送一个16进制包,接收端怎么解析。

Android UDP不接收数据

如何从任何 ip 和任何端口接收 UDP 数据包?

udp为啥收不到广播中的数据,该怎么处理

udp的recvfrom函数,能接收指定ip和端口发送来的数据吗?

UDP/TCP 发送和接收,无需端口转发