【问题标题】:how does the server handles if the client goes down in udp client/server application如果客户端在 udp 客户端/服务器应用程序中出现故障,服务器将如何处理
【发布时间】:2013-03-30 06:33:49
【问题描述】:

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

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

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

为此,我在服务器端创建了两个 Soket。 第一个 Socket 绑定()到 INADDR_ANY。

第二个套接字绑定()到我的机器 IP 地址。

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

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

这种方法正确吗? 请务必让我知道,以便我可以继续我的工作。 提前谢谢你。

【问题讨论】:

  • 这似乎是 TCP 的情况……您选择使用 UDP 有什么原因吗?
  • @FrankieTheKneeMan:谢谢您的回复。是的,我的主管强迫我使用 UDP,因为我正在开发的项目可能会造成一些数据丢失,而且我更喜欢速度而不是可靠性,这就是我选择 UDP 的原因。
  • 那么,您当前的数据流主要是从客户端到服务器?如果没有通信,您只需要定期 ping 客户端吗?我不确定你需要两个插座。
  • 实际上我有 40 个客户端,我想每 3 秒对每个客户端执行一次 ping 操作。当服务器 Ping 时,我希望我的服务器能够同时与其他客户端进行正常通信。为此,我决定使用两个线程,一个始终进行正常通信,另一个进行握手。
  • 你可以做两个线程而不使用两个套接字。

标签: c windows winapi network-programming udp


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多