如何创建一个 UDP 套接字以非阻塞方式接收本地端点中的数据(我不知道数据来自的远程端口)?
我在 Linux 中使用 .NET Core,我认为我可以使用 ReceiveAsync(),但它似乎无法以这种方式工作。
我这样解决了这个问题:
static void Main()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 0);
socket.Bind(localEP);
while( my_condition){
Receive();}
}
private bool Receive()
{
received = false;
if (socket != null)
{
SocketAsyncEventArgs ae = new SocketAsyncEventArgs();
ae.SetBuffer(recvBuffer, 0, recvBuffer.Length);
// callback
EventHandler<SocketAsyncEventArgs> rcb = new EventHandler<SocketAsyncEventArgs>(ReceiveCallback);
ae.Completed += rcb;
socket.ReceiveAsync(ae);
int counter = 0;
int recv_timeout = 500;
// create a delay waiting for data
while (!received && counter <= recv_timeout)
{
double nanosecs = recv_timeout * 1000;
long nanosperTick = (1000L * 1000L * 1000L) / Stopwatch.Frequency;
int ticks = (int)(nanosecs / nanosperTick);
Stopwatch sw = Stopwatch.StartNew();
while (sw.ElapsedTicks < ticks) { }
sw.Stop();
counter++;
}
ae.Completed -= rcb;
ae.Dispose();
}
return received;
}
private void ReceiveCallback(object sender, SocketAsyncEventArgs e)
{
switch (e.LastOperation)
{
case SocketAsyncOperation.Receive:
if (e.BytesTransferred == Number_of_bytes_I_wait_for)
{
//get e.Buffer !
}
else
Console.WriteLine("??? number_of_bytes received: " + e.BytesTransferred);
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)