2012-10-31 86 views
0

我需要同時創建一個作爲服務器和客戶端的腳本。暫時停止客戶端連接到套接字

這需要交替嘗試連接。

有沒有辦法暫時阻止任何客戶端連接,當它進入客戶端模式並嘗試連接?

據我注意到,只有一個永久性的方法來阻止這將涉及開始再聽,我試圖避免這一點。

這個想法是,這將運行在多個服務器上,它將不得不連接到自己。

每次進行連接時,每個參與者在交換他們需要交換的內容時將其中一個從(客戶端/目的地)列表中移除。

因此,我需要一種方法來阻止偵聽器,而在極少數情況下嘗試連接原因時,兩個嘗試在完全相同的時間連接到對方,併購買了掛起等待被拾取,但這不會發生。

+0

投票移動到dba.stackexchange.com – Kermit

+3

@njk爲什麼?這個問題中沒有關於數據庫或管理的內容。 – EJP

+0

@EJP在我看來,連接發生時阻塞套接字應該位於會話層,而不是應用層。 – Kermit

回答

0

你可以做兩種:

  • close()方法監聽套接字(也許重新打開它需要的時候)
  • 如果監聽套接字變得可讀,不調用accept(),但(你可以但是它確實使用操作系統資源)
  • do call accept(),但立即關閉()結果套接字。 (這很粗魯......)

以上三個選項來自systemcall/OS級別。我不知道PHP如何實現(或包裝)它們。

+0

謝謝。一些測試應該揭示它的工作原理和工作原理。 – transilvlad

+0

重讀你的問題後,我認爲唯一可能的選擇是accept()+ lookup(ip)+ close()。客戶端IP地址僅在連接請求被接受後纔可用。 lookup()應該檢查(un)所需連接的(散列)表,由程序的主動部分和被動部分維護。 (這個表可以看作是一個「工作列表」)BTW:我曾經使用這種機制在服務器中實現IP禁止功能:如果IP存在於禁止列表中,只需關閉套接字。 – wildplasser

+0

在沒有pcntl或pthreads的PHP中? – transilvlad