5

私はいくつかのコードをperlからphpに変換しようとしています。

Perlコードは次のようになります。

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

と私はphpで同じことをするためにソケットを使用しようとしています。socket_createとsocket_connect、socket_createとsocket_bind、およびfsocketopenを試しました。

その結果、「接続が拒否されました」または「許可が拒否されました」というエラーメッセージが表示されたままになります。

socket_connect()[function.socket-connect]:接続できません[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が同等の関数であるかどうかはわかりません。

ありがとう。

4

1 に答える 1

4

Perlコードが接続を確立できる場合、phpで同じことを行うために追加の権限は必要ありません。接続が拒否されたということは、リモートホストがあなたを許可しないことを意味します(おそらく間違ったアドレス/ポートに接続します)。許可が拒否されたことはさらに驚くべきことです。SELinuxを有効にしてhttpdスクリプトを実行しているときに、多くの人がこの種の問題を抱えています。あなたがその1人である場合は、SELinuxのマンページを参照してください。

SELinuxポリシーは、httpdスクリプトがネットワークに接続できないように設定できます。これにより、ハッカーがhttpdサーバーに侵入して他のマシンを攻撃するのを防ぐことができます。接続できるようにするためのスクリプトが必要な場合は、httpd_can_network_connectブール値を次のように設定できます。

setsebool -P httpd_can_network_connect 1

しかし、あなたの例にはいくつか懸念があります。ConnectPerlスニペットからの標準的なソケット接続ではないようです。それがどのモジュールに属しているのかわかりませんが、呼び出しの背後に魔法はありませんか?ドットクワッド表記(IPv4の場合)でアドレスを取得するのでsocket_connect、ホスト名を渡していないことを確認してください(最初にDNSルックアップを行う必要があります)。最後に、UDPではなく本当に必要なTCPソケットであるかどうかを確認します。

于 2012-07-07T01:50:33.993 に答える