31

PHP には、ソケットと対話するための 2 つの異なる API があります。基本的に C ソケット API をラップする低レベルのソケット API があります。そして、PHP ストリーム インターフェイスを実装する高レベル ストリーム ソケット API があります。

残念ながら、ストリーム ソケット API は、低レベルのソケット オプションの設定をサポートしていません。しかし、これは私がしなければならないことです。同様に、ソケット API は 、freadfwriteなどの標準関数呼び出しの使用をサポートしていないためfclose、残りのコードと互換性がありません。

PHP 5.4 でsocket_import_stream関数が導入されました。これにより、ストリーム ソケットを取得して、基になるソケット リソースを取得できます。私の計画は、これを使用してストリーム ソケットを作成し、ソケットを取得し、いくつかのオプションを設定してから、元のストリーム ソケットを引き続き使用することでした。

これがうまくいかなかった理由は、バインドする前にオプションを設定する必要があるためです。ストリーム ソケットをバインドする唯一の方法は、既にバインドを実行しているstream_socket_serverを使用することです。それが私がそれを使うことができなかった理由です。

socket_import_streamソケット リソースをストリーム ソケットに変換できるように、 の逆を探しています。私はそのような機能を見つけることができませんでしたが、非常に賢い人が私を助けてくれることを願っています. または、それを行う PHP ソースにパッチを送信します。または、そのようなパッチを作成するためのヒントを教えてください。

編集:PHPストリームに作用してDNSパケットを解析するコードがいくつかあります。そのコードをマルチキャスト対応のソケットで再利用したいと考えています。ストリーム ソケットでマルチキャストを有効にできません。また、raw ソケットでストリーム関数を使用できません。

EDIT2: このストリームを で使用したいstream_selectので、残念ながらカスタム ストリーム ラッパーはオプションではありません。

4

2 に答える 2

6

stream_wrapper_register関数を、 streamWrapperテンプレートを実装するクラスと組み合わせて使用​​して、マルチキャスト ソケット ストリームを作成できます。これにより、組み込みのストリーム関数をすべて活用できますが、socket_export_stream ほど便利ではありません。

于 2012-09-05T17:13:05.120 に答える
5

これがうまくいかなかった理由は、バインドする前にオプションを設定する必要があるためです。ストリームソケットをバインドする唯一の方法は、すでにバインドを実行しているstream_socket_serverを使用することです。だから使えなかった。

の4番目のパラメータはstream_socket_server()です$flags。これはデフォルトでに設定されてSTREAM_SERVER_BIND | STREAM_SERVER_LISTENいるため、省略せずに、0(または別のフラグを)指定してください。

socket_bind()すべての設定が完了した後でも、 &を使用してそのソケットを手動でバインド(&リッスン)できますsocket_listen()

私は試していませんでした、ただのアイデアです。

于 2012-09-10T15:01:46.857 に答える