如果客户端在udp客户端/服务器应用程序中关闭,服务器如何处理

时间:2013-03-30 06:33:49

标签: c windows winapi network-programming udp

我想在我的udp服务器应用程序上实现两个功能。

  1. 创建持续接收来自任何客户端的数据的线程。

  2. 创建一个在特定时间段后在服务器套接字上连续发送数据的线程,并等待来自客户端的回复(握手机制)。 (我实现了这一点,以确保无论何时任何客户端发生故障,客户端都不会发回数据,服务器会知道客户端已关闭。)

  3. 为此,我在服务器端创建了两个Sokets。 第一个套接字是bind()ed到INADDR_ANY。

    第二个套接字是bind()ed到我的机器IP地址。

    客户端的所有发送和接收都在第一个套接字上完成。

    确保客户端没有关闭的握手机制是在第二个套接字上完成的。

    这种做法是否正确? 请告诉我,以便继续我的工作。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我的意思是,你的解决方案可行,但我没有看到你不能使用更多带内控制机制的原因。试试这个,服务器上只有一个套接字:

List connections contains pairs (client, lastPacketTime)
Socket is a single UDP Socket

Thread 1 Loop:
    Get new UDP Datagram P From Socket
    If P.client in List: 
        update lastPacketTime
    Else:
        add P.client to list
    If P is not Ping datagram:
        Do other operations on P

Thread 2 Loop:
    For client in List with lastPacket time 3-10 Seconds ago:
        send ping request via Socket
    For client in List with lastPacket time > 10 Seconds ago:
        Mark client as down.
    Sleep for some time

这在客户端:

Loop:
    If I have data to send:
        Send it!
    Else if I have a ping request in my UDP Socket:
        Send Ping datagram
    Else
        Sleep for some time.

如果您需要一个比这更可靠的握手,您可能会考虑在UDP端口旁边打开与服务器的TCP连接。然后,服务器可以使用TCP连接来检查活动。我必须说实话,当人们尝试使用面向连接的UDP时,我脖子后面的头发会竖立起来。如果您担心所有处理和更新ping时间,可以添加第三个线程:

List contains pairs (client, lastPacketTime)
Queue contains Datagrams with time updates.
Socket is a single UDP Socket

Thread 1 Loop:
    Get new UDP Datagram P from Socket
    Add P to Queue
    If P is not Ping datagram:
        Do other operations on P

Thread 2 Loop:
    Get new Datagram P from Queue
    If P.client in List: 
        update lastPacketTime
    Else:
        add P.client to list

Thread 3 Loop:
    For client in List with lastPacket time 3-10 Seconds ago:
        send ping request via Socket
    For client in List with lastPacket time > 10 Seconds ago:
        Mark client as down.
    Sleep for some time