Skip to main content

De temps en temps, quelqu'un pose la question suivante : "Nous avons ajouté notre port d'application au fichier de services et maintenant une autre application l'utilise - pourquoi". La réponse est que le fichier de services ne réserve pas les numéros de port. Le fichier de services existe pour que les applications puissent appeler la fonction getservbyname pour trouver le numéro de port associé à un service ou appeler la fonction getservbyport pour trouver le nom d'un service associé à un numéro de port. Rien n'empêche deux services différents de correspondre au même numéro de port, bien que la fonction getservbyport ne renvoie que le premier. Il n'est pas non plus nécessaire qu'une application appelle la fonction getservbyname pour savoir quel port elle doit utiliser. Un développeur d'application peut simplement coder en dur un numéro de port ou permettre qu'il soit entré comme paramètre.

Il n'y a aucun moyen de réserver un numéro de port - si ce n'est de l'utiliser, et alors seulement si vous ne réglez pas l'option de socket REUSEADDR ; commencez donc votre application dès que possible après le démarrage du STCP, avant que cette autre application ne s'empare de votre port.

 

Parfois, le coupable n'est pas une autre application serveur mais une application client. La plupart des applications clientes ne se lient pas à un port local spécifique, mais comme un port local est nécessaire, le STCP en attribue un de la gamme des ports dynamiques (49152 - 65535). Si votre application utilise un port de cette plage, je vous suggère de le modifier pour utiliser un port de la plage enregistrée, 1024-49151. Ces ports ne seront utilisés que si une application s'y lie explicitement.

 

OK, supposons qu'il existe une autre application utilisant le port de votre application ; comment pouvez-vous identifier de quelle application il s'agit et surtout qui l'a lancée ? Il s'agit d'un processus en trois étapes :

 

  1. Exécuter la commande “netstat -numeric -all_sockets -PCB_addr” et identifier l'intrus, dans ce cas le numéro de port qui m'intéresse est 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. Exécuter la commande

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

passer à la dump_onetcb demander le PCB de l'intrus, 8e3aa300. Cela permet d'identifier le dispositif STCP associé à la prise.
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. Exécuter la commande “who_locked #stcp.m16_202” pour déterminer quel processus utilise l'appareil.
stcp.m16_202:
Object is write locked by Barney_Rubble.Dev (login) on module
%vs#m1
executing stcp_calls.pm.

 

Et voilà, il ne vous reste plus qu'à contacter ce Barney Rubble et lui suggérer poliment d'utiliser un autre numéro de port.

2024 Stratus Technologies.