PRB: Winsock control genera el error 10048 - Dirección en uso

Seleccione idioma Seleccione idioma
Id. de artículo: 173619 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

El control Winsock obtendrá un error después de llamar un método de conectar si el mismo puerto local se ha utilizado en los últimos cuatro minutos.

Causa

El control de socket de Windows no tiene la posibilidad de establecer la opción de socket SO_REUSEADDR. Esta opción permite enlazar a una dirección que ya está en uso el socket.

Cuando cierra el identificador de un socket, algunos negociación adicional pasa entre el cliente y el servidor. El socket esperará hasta dos veces el tiempo máximo que windows esperaría recibir una confirmación desde el otro extremo del socket cerrado el puerto. De forma predeterminada, esta opción se establece en dos minutos. Por tanto, Windows puede espere hasta cuatro minutos antes de libera el puerto realmente.

Esto desactiva ese puerto específico hasta que realmente se libera.

Solución

La única solución es no utilizar un puerto local específico. Si establece la propiedad puertoLocal a cero, Winsock se elija un puerto local aleatorio y utilizarlo hasta que se invoca un método Close en el Control WinSock.

Estado

Este comportamiento es por diseño.

Más información

Establecer la propiedad puertoLocal del socket a cero, hará que Windows seleccionar un puerto aleatorio.

Para ello, coloque el código siguiente justo antes de la línea que realiza la conexión:
   Winsock1.LocalPort = 0
   Winsock1.Connect
				

Pasos para reproducir este comportamiento

En el siguiente ejemplo muestra cómo reproducir el problema y cómo evitarlo. En el código de "myserver" indica cualquier Windows 2000 o Windows NT Server con servicios de TCP/IP simple, que incluye un servidor de eco en puerto 7.
  1. Inicie un proyecto nuevo de Visual Basic. Se creará Form1 de manera predeterminada.
  2. Agregue el control de Windows Sockets a Form1.
  3. Agregue el código siguiente al formulario:
          Option Explicit
    
          Private Sub Form_Load()
            Dim res As Long
            Winsock1.LocalPort = 2500
            Winsock1.RemoteHost = "myserver"
            Winsock1.RemotePort = 7
            Winsock1.Connect
          End Sub
    
          Private Sub Winsock1_Error(ByVal Number As Integer, _
            Description As String, ByVal Scode As Long, _
            ByVal Source As String, ByVal HelpFile As String, _
            ByVal HelpContext As Long, CancelDisplay As Boolean)
    
            MsgBox Description, vbOKOnly, "Winsock Error: " & Number
            CancelDisplay = True
          End Sub
    
    					
  4. Ejecute el programa.
  5. Salir del programa.
  6. Ejecute de nuevo el programa. Tenga en cuenta que esto hace que un cuadro de diálogo aparecen con el mensaje de error:
    Dirección en uso.
    Para corregir el código, cambie la línea:
       Winsock1.LocalPort = 2500
    						
    a:
       Winsock1.LocalPort = 0
    						
    y realizar los pasos 4 a 6 varias veces. No debe obtener los errores.

Propiedades

Id. de artículo: 173619 - Última revisión: viernes, 28 de abril de 2000 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic 5.0 Enterprise Edition
Palabras clave: 
kbmt kbapi kbctrl kberrmsg kbnetwork kbprb kbwinsock KB173619 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 173619
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com