2009-11-12 111 views
0

目前,我有我使用產卵多個可執行文件,(語音聊天服務器)一個小的Python腳本,並且在軟件的下一個版本,服務器具有接收UDP端口上的心跳信號的能力。 (在一臺機器上可能有數千臺服務器,範圍從端口7878起)多個程序使用相同的UDP端口?可能?

我的問題是,這些服務器可能(讀:將)與我的Python腳本在同一臺機器上運行,打開一個UDP端口,然後發送心跳信號,等待回覆,然後瞧......當/如果他們沒有通過查殺任務並重新加載服務器來響應,我可以重新啓動服務器。

問題是,我無法打開該服務器已在使用的UDP端口。有沒有解決的辦法?項目負責人仍然在實施心跳,所以我相信任何有關心跳系統如何實施的建議都會受到歡迎。 - 這是一個非常通用的腳本,儘管這可能適用於其他程序,所以我的主要焦點仍然在該UDP端口上進行通信。

回答

2

這是不可能的。什麼你必須做的就是有一個處理在一個端口的所有UDP通信的一個UDP主控方案,並與您的服務器以另一種方式(在不同的端口,命名管道,... UDP)

+0

根據定義是不可能的。每個端口一個程序就是UDP(和TCP)的工作方式。一個程序可以派發給其他程序。 – 2009-11-12 15:38:28

+0

你是對的,通過操作系統是不可能的。如果你有網絡適配器的原始訪問權限(通過'libpcap'或類似的),這將是可能的,但不是很漂亮...... – Wim 2009-11-12 15:48:10

+0

是否有一種實現方式圍繞此,如可能以特定方式實現心跳? 也許我可以發送廣播數據包,並將回覆發送到開放端口?所有的服務器都會得到數據包,並且可能會被指示在7877處進行回覆? - 項目主管對我懷疑的事情持開放態度。 – ThantiK 2009-11-12 15:49:13

1

我通信很確定這在Linux上是可行的;我不知道其他的UNIX。

有兩種方法來文件描述符傳播從一個進程到另一個:

  • 當一個進程fork()S,孩子繼承父的所有文件描述符。
  • 進程可以通過「UNIX域套接字」將文件描述符發送到另一個進程。見SENDMSG()recvmsg()。在Python中,_multiprocessing擴展模塊將爲您執行此操作;見_multiprocessing.sendfd()_multiprocessing.recvfd()

我還沒有與多個進程監聽UDP套接字實驗。但是對於TCP,在Linux上,如果多個進程都監聽一個TCP套接字,其中一人將當連接進來是隨機選擇的。所以我懷疑Linux確實東西明智的多,當進程都監聽同一UDP插座。

試試吧,告訴我們!

相關問題