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 端口无法接收数据的主要内容,如果未能解决你的问题,请参考以下文章