PHP には、ソケットと対話するための 2 つの異なる API があります。基本的に C ソケット API をラップする低レベルのソケット API があります。そして、PHP ストリーム インターフェイスを実装する高レベル ストリーム ソケット API があります。
残念ながら、ストリーム ソケット API は、低レベルのソケット オプションの設定をサポートしていません。しかし、これは私がしなければならないことです。同様に、ソケット API は 、fread
、fwrite
などの標準関数呼び出しの使用をサポートしていないためfclose
、残りのコードと互換性がありません。
PHP 5.4 でsocket_import_stream関数が導入されました。これにより、ストリーム ソケットを取得して、基になるソケット リソースを取得できます。私の計画は、これを使用してストリーム ソケットを作成し、ソケットを取得し、いくつかのオプションを設定してから、元のストリーム ソケットを引き続き使用することでした。
これがうまくいかなかった理由は、バインドする前にオプションを設定する必要があるためです。ストリーム ソケットをバインドする唯一の方法は、既にバインドを実行しているstream_socket_serverを使用することです。それが私がそれを使うことができなかった理由です。
socket_import_stream
ソケット リソースをストリーム ソケットに変換できるように、 の逆を探しています。私はそのような機能を見つけることができませんでしたが、非常に賢い人が私を助けてくれることを願っています. または、それを行う PHP ソースにパッチを送信します。または、そのようなパッチを作成するためのヒントを教えてください。
編集:PHPストリームに作用してDNSパケットを解析するコードがいくつかあります。そのコードをマルチキャスト対応のソケットで再利用したいと考えています。ストリーム ソケットでマルチキャストを有効にできません。また、raw ソケットでストリーム関数を使用できません。
EDIT2: このストリームを で使用したいstream_select
ので、残念ながらカスタム ストリーム ラッパーはオプションではありません。