multithreading - C# : UDP Listener Thread

标签 multithreading sockets xna udp

我想在我的 XNA-Networkgame 中使用 UDP 套接字。 现在我正在尝试编写一个可靠的监听线程,但存在一些问题。

如果我使用socket.Receive,它将等待一个数据包。这对于我的监听线程来说很好。 我的线程有一个像这样的 while 循环:

while(Listen == true)
{
    socket.Receive(...);
}

但是如果我将 Listen-Flag 交换为 false(如果我想停止监听),它将卡在最后一个 .Receive() 中。

然后我查看了 Methodes .BeginReceive()。如果数据包到达,它将调用方法。 但要接收数据,我必须使用 .EndReceive(),这就是我遇到的问题。我想仍然监听数据包,并且在数据包到达时不要停止监听。

所以我仍然使用带有“.Receive()”的阻塞版本。我可以通过调用 Thread.abort() 来强制监听线程取消,但这并不好。

目前我测试数据是否可用:

while(Listen == true)
{
    if(socket.Available > 0)
    {
        socket.Receive(...);
    }
}

但我认为这不是最好的方法...如果在 if 子句之后不久,另一个线程正在调用 socket.Receive(..) ,它将再次无意中卡住。 有没有办法取消.Receive(..)方法? 我尝试设置超时,但是如果.Receive超时,就会抛出异常...

我想要一个简单的 udp 监听线程,我可以优雅地停止。 :-) 在 MSDN 中,我没有找到一个监听多个数据包的监听器示例。 如何处理其他程序员这个问题?

最佳答案

Listen标记标记为 volatile ,因此线程之间的更改是可见的。

public volatile bool Listen{get; set;}

处理线程中适当的异常:

Thread listener = new Thread(()=>
{
    while(Listen == true)
    {
        try
        {
            socket.Receive();
        }
        catch(ThreadInterruptException)
        {
            break; // exit the while loop
        }
        catch(SocketException)
        { 
            break; // exit the while loop
        }
    }
});
listener.IsBackground = true;
listener.Start();

在将 Listen 标志切换为 false 的代码中,您可以关闭套接字或中断线程:

Listen = false;

socket.Shutdown(SocketShutdown.Both);
socket.Close();
//
// OR
//
listener.Interrupt();

关于multithreading - C# : UDP Listener Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3627013/

相关文章:

java - ScheduledExecutorService 一线程多任务

单核处理器与多核处理器上的多线程和多任务处理

ios - 读取复杂的套接字响应

更改套接字 sendto() 中的源 IP

c# - 检查线和旋转矩形之间的交点

sql - XNA Windows 游戏简单数据库 Access - .mdb 不起作用 [非常基本]

python - 多线程应用程序未正确输出

c - 如何在 C 中使用 pthreads 减少线程完成时的屏障计数

c# - 来自 XNA GamerService 的无效跨线程访问

java - 套接字绑定(bind)错误