Zum Hauptinhalt springen

Hin und wieder stellt jemand die folgende Frage: "Wir haben den Port unserer Anwendung in die Dienste-Datei aufgenommen, und jetzt wird er von einer anderen Anwendung verwendet - warum? Die Antwort ist, dass die services-Datei keine Portnummern reserviert. Die Datei services 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 verhindert, dass zwei verschiedene Dienste auf dieselbe Portnummer abgebildet werden können, obwohl die Funktion getservbyport nur den ersten Dienst zurückgibt. Es ist auch nicht erforderlich, dass eine Anwendung getservbyname aufruft, um herauszufinden, welchen Port sie verwenden soll. Ein Anwendungsentwickler kann einfach eine Portnummer hart kodieren oder sie als Parameter eingeben lassen.

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

 

Manchmal ist nicht eine andere Serveranwendung der Übeltäter, sondern eine Client-Anwendung. Die meisten Client-Anwendungen 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, sollten Sie sie auf einen Port aus dem registrierten Bereich (1024-49151) umstellen. Diese Ports werden nur verwendet, wenn sich eine Anwendung ausdrücklich an sie bindet.

 

OK, nehmen wir an, dass es eine andere Anwendung gibt, die den Port Ihrer Anwendung verwendet; wie können Sie herausfinden, um welche Anwendung es sich handelt und, noch wichtiger, wer sie gestartet hat? Es ist ein dreistufiger Prozess:

 

  1. Führen Sie den Befehl “netstat -numeric -all_sockets -PCB_addr” und den Eindringling zu identifizieren, in diesem Fall ist die Portnummer, an der ich interessiert bin, 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

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

Übergabe der PCB des Interlopers, 8e3aa300, an die dump_onetcb-Anforderung. Damit wird das mit dem Socket 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 “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.

 

Jetzt müssen Sie nur noch diesen Barney Rubble kontaktieren und ihm höflich vorschlagen, eine andere Anschlussnummer zu verwenden.

© 2024 Stratus Technologies.