Zum Hauptinhalt springen

Hin und wieder stellt jemand die folgende Frage: „Wir haben unseren Anwendungsport zur Dienstdatei hinzugefügt, und jetzt wird er von einer anderen Anwendung verwendet – warum?“ Die Antwort lautet, dass die Dienstdatei keine Portnummern reserviert. Die Dienstdatei existiert, damit Anwendungen die Funktion „getservbyname“ aufrufen können, um die mit einem Dienst verbundene Portnummer zu finden, oder die Funktion „getservbyport“, um den Namen eines mit einer Portnummer verbundenen Dienstes zu finden. Es gibt nichts, was zwei verschiedene Dienste daran hindert, derselben Portnummer zugeordnet zu werden, obwohl die Funktion „getservbyport“ nur den ersten zurückgibt. Es gibt auch keine Anforderung, dass eine Anwendung „getservbyname“ aufrufen muss, um herauszufinden, welchen Port sie verwenden soll. Ein Anwendungsentwickler kann einfach eine Portnummer fest codieren oder die Eingabe als Parameter zulassen.

Es gibt keine Möglichkeit, eine Portnummer zu reservieren – außer sie zu verwenden, und auch nur dann, wenn Sie die Socket-Option REUSEADDR nicht setzen. Starten Sie Ihre Anwendung daher so bald wie möglich nach dem Start von STCP, bevor eine andere Anwendung Ihren Port belegt.

 

Manchmal ist nicht eine andere Serveranwendung, sondern eine Clientanwendung der Übeltäter. Die meisten Clientanwendungen binden sich nicht an einen bestimmten lokalen Port, aber da ein lokaler Port benötigt wird, weist STCP einen aus dem dynamischen Portbereich (49152 – 65535) zu. Wenn Ihre Anwendung einen Port in diesem Bereich verwendet, empfehle ich Ihnen, einen Port aus dem registrierten Bereich 1024–49151 zu verwenden. Diese Ports werden nur verwendet, wenn eine Anwendung sich explizit an sie bindet.

 

OK, nehmen wir einmal an, dass eine andere Anwendung den Port Ihrer Anwendung nutzt. Wie können Sie feststellen, um welche Anwendung es sich handelt und vor allem, wer sie gestartet hat? Dazu sind drei Schritte erforderlich:

 

  1. Führen Sie den Befehl aus. “netstat -numeric -all_sockets -PCB_addr” und identifizieren Sie den Eindringling. In diesem Fall interessiert mich die Portnummer 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
  1. Führen Sie den Befehl aus.

“analyze_system -request_line 'match dv; dump_onetcb 8e3aa300' -quit”

Übergeben Sie an die dump_onetcb-Anforderung die PCB des Eindringlings, 8e3aa300. Dadurch wird das mit dem Sockel verbundene STCP-Gerät identifiziert.
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)
  1. Führen Sie den Befehl aus. “who_locked #stcp.m16_202” um festzustellen, welcher Prozess das Gerät verwendet.
stcp.m16_202:
Object is write locked by Barney_Rubble.Dev (login) on module
%vs#m1
executing stcp_calls.pm.

 

Das war's auch schon. Jetzt müssen Sie nur noch diesen Barney Rubble kontaktieren und ihm höflich vorschlagen, eine andere Portnummer zu verwenden.