2012-12-14 63 views
0

最近我正在處理網絡編程(尤其是P2P系統)。通常的程序我打交道,一個地方有這樣的事情(在它自己的線程中運行):處理主監聽迴路外的網絡協議步驟

while True: 
    handle(receive()) 

我該如何處理一系列相關的發送/接收操作。例如,當我想有這樣的:

def inviteNode(receiver): 
    send(receiver, INVITE) 

    if receive() == OK: 
     send(receiver, SOME_INFORMATION) 
     ... 

我的意思是幾個發送/接收功能互相依賴的,並有一定的順序操作。如果上面有inviteNode()這樣的東西會很好(因爲協議的所有步驟都在代碼中的相同位置,並且您可以通過查看代碼來追溯訂單),但只在我的偵聽循環之外調用將不會這樣做,因爲如何決定獲得哪些數據。

是否有一個全球性的國家唯一的解決方案呢?在做完第一個send(receiver, INVITE)之後,我是否需要記住某個地方,我希望從該特定節點獲得OK,我只是將INVITE發送給?當我有幾個不同的這些相關的發送/接收操作時,這不是很複雜嗎?

PS:只是爲了確保:這是關於UDP連接。

在此先感謝!

回答

0

似乎你需要使用套接字輪詢。您可以使用select()系統調用(跨平臺解決方案,但速度不像使用特殊的系統依賴API那麼快),或者如果您針對的是linux,則可以嘗試使用epoll API。

的主要思想是:你有一些網絡插座,那些可以在不同的狀態(例如,可接收數據)。

您可以查詢一些事件(讀,寫,異常)這個插座設置和執行依賴於你所需要的需要採取的行動。

例如,Nginx的http服務器使用該架構。

此外,您需要保存上下文,例如應該通知哪些套接字並檢查哪些套接字以及哪些數據已被接收或發送,以及您可能需要的其他信息。

這是一個有點複雜,但可以做的工作:finite-state machines