サービスファイルにアプリケーションのポートを追加したのに、他のアプリケーションがそれを使っています。答えは、サービスファイルがポート番号を予約していないからです。サービスファイルは、アプリケーションが getservbyname 関数を呼び出してサービスに関連付けられたポート番号を見つけたり、 getservbyport 関数を呼び出してポート番号に関連付けられたサービス名を見つけたりできるように存在しています。getservbyport 関数は最初のものだけを返しますが、2 つの異なるサービスが同じポート番号にマッピングされることを防ぐものは何もありません。また、アプリケーションが getservbyname を呼び出して、どのポートを使うべきかを調べる必要もありません。アプリケーション開発者は、ポート番号をハードコーディングするか、 パラメータとして入力することができます。
ポート番号を予約する方法はありません - REUSEADDRソケットオプションを設定していない場合にのみ、ポート番号を使用する以外にはありません; そのため、STCPが起動した後、他のアプリケーションにポートを奪われる前に、できるだけ早くアプリケーションを起動してください。
原因が他のサーバ・アプリケーションではなく、クライアント・アプリケーションである場合もあります。ほとんどのクライアントアプリケーションは特定のローカルポートにバインドしませんが、ローカルポートが必要なので、STCPはダイナミックポート範囲(49152~65535)のポートを割り当てます。アプリケーションがこの範囲のポートを使用している場合は、登録されている1024~49151の範囲のポートを使用するように変更することをお勧めします。これらのポートは、アプリケーションが明示的にバインドした場合にのみ使用されます。
では、あなたのアプリケーションのポートを使用している他のアプリケーションが存在すると仮定してみましょう。それは3つのステップのプロセスです。
- コマンドの実行
“netstat -numeric -all_sockets -PCB_addr”
侵入者を特定して、この場合、私が興味を持っているポート番号は13592です。
netstat -numeric -all_sockets -PCB_addr
Active connections (including servers)
PCB Proto Recv-Q Send-Q Local Address Foreign Address
(state)
. . .
8e3aa300 tcp 0 0 *:13592 *:* LISTEN
. . .
ready 13:50:12
- コマンドの実行
“analyze_system -request_line 'match dv; dump_onetcb 8e3aa300' -quit”
dump_onetcbリクエストにインターローパーのPCB(8e3aa300)を渡します。これはソケットに関連付けられたSTCPデバイスを識別します。
OpenVOS Release 17.0.1aj, analyze_system Release 17.0.1aj
Current process is 664, ptep 8E0EE800, Noah_Davids.CAC
sth_dvtx = 121 (stcp.m16_202)
- コマンドの実行
“who_locked #stcp.m16_202”
を使用して、どのプロセスがデバイスを使用しているかを判断します。
stcp.m16_202:
Object is write locked by Barney_Rubble.Dev (login) on module
%vs#m1
executing stcp_calls.pm.
そこには それがある 君が今すべきことは このバーニー・ルブルに連絡して 別のポート番号を使うように丁重に提案することだ