2013-03-30 29 views
0

我希望在我的udp服務器應用程序上實現兩個功能。如果客戶端在udp客戶端/服務器應用程序中出現故障,服務器如何處理

  1. 創建連續接收來自任何客戶端的數據的線程。

  2. 創建一個線程,在特定時間段後持續在服務器套接字上發送數據,並等待來自客戶端的回覆(握手機制)。 (我實現這個使歐爾,每當任何客戶端宕機,客戶端不發回的數據和服務器來知道客戶端已關閉。)

我已經創建了兩個Sokets服務器端此目的。 第一個套接字綁定()到INADDR_ANY。

第二個套接字綁定()到我的機器IP地址。

所有從客戶端發送和接收都在第一個套接字上完成。

確保客戶端沒有關閉的握手機制在第二個套接字上完成。

這種方法是否正確? 請讓我知道,以便我可以繼續我的工作。 預先感謝您。

+2

這似乎是一個TCP的情況...有沒有您選擇使用UDP理由嗎? – FrankieTheKneeMan

+0

@FrankieTheKneeMan:謝謝你的迴應。 是的,我的主管被迫使用UDP,因爲我正在開發的項目可能會造成一些數據丟失,我的偏好是速度超過可靠性,這就是我選擇UDP的原因。 – Ayse

+0

那麼,您當前的數據流大部分來自客戶端到服務器?如果沒有通信,您只需定期ping客戶端?我不確定你需要兩個插座。 – FrankieTheKneeMan

回答

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. 

如果你需要比這更可靠的握手,你可能會考慮只打開一個TCP連接服務器旁邊的UDP的東西。然後服務器可以使用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