2012-07-06 326 views
4

我想將一些代碼從perl轉換爲php。「連接被拒絕」錯誤在socket_connect php

Perl代碼看起來像下面:

my $handle = Connect($port, $host);

,我試圖用插座做同樣的事情在PHP。 我試過socket_create和socket_connect, socket_create和socket_bind,以及fsocketopen。

其結果是,我堅持用錯誤信息,說 「連接被拒絕」 或 「權限被拒絕」:

socket_connect()[function.socket-連接]:無法連接[111]:連接拒絕

我不知道這是我需要解決的問題,還是因爲perl中的代碼工作正常(我沒有寫代碼)而導致的權限問題。

我的PHP代碼如下所示:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if(!$socket){ 
     die('Error: socket_create()'); 
} 
if(!socket_connect($socket,$host,$port)) { 
     die('Error: socket_connect()'); 
} 

我不是誰管理服務器,所以我需要問別人的訪問,如果它是一個權限問題。我應該特別要求什麼?

或者我應該使用一些其他功能來連接到服務器?我是perl的新手,所以我不確定socket_connect是否等同於使用的函數。

謝謝。

回答

3

如果您的Perl代碼能夠建立連接,則不需要額外的權限在php中執行相同的操作。 拒絕連接意味着遠程主機不允許你進入(你可能連接到錯誤的地址/端口)。 權限被拒絕更令人驚訝,許多人在啓用SELinux的情況下運行httpd腳本時遇到這種問題。如果您是其中之一,請參閱SELinux手冊頁:

SELinux策略可以設置爲不允許httpd腳本連接到網絡。這將防止黑客闖入你的httpd服務器並攻擊其他機器。如果您需要腳本能夠連接,您可以設置httpd_can_network_connect布爾上:

setsebool -P httpd_can_network_connect 1

我有幾個concers到你的例子,雖然。你的Perl片段中的Connect似乎不是標準套接字連接;我不知道它屬於哪個模塊,但是你確定電話背後沒有魔法嗎?由於socket_connect以虛線四捨五入形式表示地址(對於IPv4),請確保您未傳遞主機名(您需要首先進行DNS查找)。最後檢查它是否真的是你需要的TCP套接字,而不是UDP。

+0

很好的答案!做得好。 – 2012-07-07 06:41:43

+0

謝謝你的回答。 Connect是一個輔助函數,而不是標準套接字連接函數。我還沒有建立正確的聯繫,但我會繼續努力,你的回答會非常有幫助。再次感謝。 – user1507925 2012-07-10 01:35:14

+0

@ user1507925樂意提供幫助,如果您無法解決問題,請向我們發送一些更多詳細信息。 – tomasz 2012-07-10 23:04:18