Socket_Bind()関数は、作成されたソケットを特定のIPアドレスとポートにバインドするために使用され、ソケットが対応するアドレスとポートからのネットワーク接続要求を受け入れることができるようにします。
<span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span></span>$ソケット:バインドする必要があるソケットリソース。
$アドレス:サーバーのIPアドレス( LocalHostまたは0.0.0.0など)。
$ポート:バインドするポート番号。
バインディングが成功した場合はtrueを返し、失敗した場合はfalseを返します。
socket_bind()が成功するかどうかを検出するには、最初に関数の返品値を明確にする必要があります。成功については真実であり、失敗にfalseを返します。しかし、返品値のみに依存するだけでは十分ではありません。また、 socket_last_error()を組み合わせて、より詳細なエラー情報を取得することもできます。
socket_bind()を使用する場合、通常、その返品値を確認して、成功したかどうかを判断します。返品値が偽の場合、それはバインディングが失敗したことを意味します。
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket 作成に失敗しました: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>());
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">"127.0.0.1"</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket バインディングは失敗しました: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>));
</span><span><span class="hljs-keyword">exit</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket バインディングが成功しました!"</span></span><span>;
}
</span></span>socket_bind()がfalseを返す場合、 socket_last_error()を使用して、より多くのエラー情報を取得します。 socket_last_error()エラーコードを返します。エラーコードは、 socket_strerror()を使用して理解しやすいエラー情報に変換できます。
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$error_code</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-variable">$error_message</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$error_code</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"バインディングは失敗しました,エラーコード:<span class="hljs-subst">$error_code</span></span></span><span>,エラーメッセージ:</span><span><span class="hljs-subst">$error_message</span></span><span>";
}
</span></span>一般的なエラーメッセージは次のとおりです。
すでに使用されている住所
許可が拒否されました
すでに使用されている住所
エラーの原因:IPアドレスとポートは他のプロセスに拘束されています。
解決策:他のプログラムがポートを使用しているかどうかを確認するか、使用するポート番号を変更します。
許可が拒否されました
エラーの原因:現在のユーザーには、ポートにバインドするのに十分な権限がありません(特に1024未満のポート)。
解決策:より高いポートを使用するか、管理者の特権を使用してスクリプトを実行してください。
無効な議論
エラーの原因: socket_bind()に渡されたIPアドレスまたはポートが正しくありません。
解決策:着信アドレスとポートが有効であることを確認してください。
バウンドソケットがまだ有効かどうかをプログラムに確認する場合は、 Socket_GetSockName()を使用して、現在バインドされているソケットのアドレスとポートを取得できます。この関数はバインディング情報を返し、バインディングが成功しない場合、返品値は空になります。
<span><span><span class="hljs-variable">$bound_address</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-variable">$bound_port</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_getsockname</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$bound_address</span></span><span>, </span><span><span class="hljs-variable">$bound_port</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"アドレスにバインドされたソケット <span class="hljs-subst">$bound_address</span></span></span><span> およびポート </span><span><span class="hljs-subst">$bound_port</span></span><span>";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"套接字バインディングは失敗しました"</span></span><span>;
}
</span></span>