Ir al contenido principal

De vez en cuando alguien hace la siguiente pregunta: "Añadimos nuestro puerto de aplicación al archivo de servicios y ahora alguna otra aplicación lo está usando - por qué". La respuesta es porque el archivo de servicios no reserva los números de puerto. El archivo de servicios existe para que las aplicaciones puedan llamar a la función getservbyname para encontrar el número de puerto asociado a un servicio o llamar a la función getservbyport para encontrar el nombre de un servicio asociado a un número de puerto. No hay nada que impida que dos servicios diferentes se asignen al mismo número de puerto, aunque la función getservbyport sólo devolverá el primero. Tampoco hay ningún requisito de que una aplicación llame a getservbyname para averiguar qué puerto debe utilizar. El desarrollador de la aplicación puede simplemente codificar el número de puerto o permitir que se introduzca como un parámetro.

No hay forma de reservar un número de puerto - aparte de usarlo, y sólo si no se establece la opción de REUSEADDR socket; por lo tanto, inicie su aplicación lo antes posible después de que se inicie STCP, antes de que esa otra aplicación se apodere de su puerto.

 

A veces el culpable no es otra aplicación de servidor sino una aplicación de cliente. La mayoría de las aplicaciones cliente no se vinculan a un puerto local específico, pero como se necesita un puerto local, el STCP asigna uno del rango de puertos dinámicos (49152 - 65535). Si su aplicación utiliza un puerto en este rango, le sugiero que lo cambie para utilizar un puerto del rango registrado, 1024-49151. Estos puertos sólo se utilizarán si una aplicación se vincula explícitamente a ellos.

 

Bien, supongamos que hay otra aplicación que usa el puerto de tu aplicación; ¿cómo puedes identificar de qué aplicación se trata y, lo que es más importante, quién la inició? Es un proceso de tres pasos:

 

  1. Ejecute el comando “netstat -numeric -all_sockets -PCB_addr” e identificar al intruso, en este caso el número de puerto que me interesa es 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. Ejecute el comando

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

pasando a la solicitud de dump_onetcb el PCB del intruso, 8e3aa300. Esto identifica el dispositivo STCP asociado al enchufe.
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. Ejecute el comando “who_locked #stcp.m16_202” para determinar qué proceso está usando el dispositivo.
stcp.m16_202:
Object is write locked by Barney_Rubble.Dev (login) on module
%vs#m1
executing stcp_calls.pm.

 

Y ahí lo tienes, todo lo que necesitas hacer ahora es contactar con este Barney Rubble y educadamente sugerirle que use un número de puerto diferente.