【问题标题】:UDP Port Cannot Receive DataUDP 端口无法接收数据
【发布时间】: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,就无法回答。即使有一个,最可能的答案是您有网络配置问题。

标签: c# udp


【解决方案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 方法
猜你喜欢
  • 2012-02-13
  • 2012-05-28
  • 2013-11-08
  • 2011-05-13
  • 1970-01-01
  • 2013-08-09
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多