WinSock + VisualBasic

fapper
07 de Abril del 2005
El problema es que en el siguiente programa:
Yo quiero que se conecte mande los datos y se desconecte para quedar en modo Listen, o sea que el programa corrido en cualquier parte de la red (ya sea un lan comun o con un servidor de pormedio) actue como cliente o servidor segun mande o reciba datos ademas de permitir que comunicaciones en cualquier direccion y numero de maquinas conectadas.
Se que el Winsock tiene el problema (error 10048) que el puerto queda no habilitado para reusarlo hasta por 4 minutos. no se si existe una forma de cerrar el puerto a la fuerza.
Cualquier otra ayuda es agradecida:

Controles en la aplicacion:
3 text (1 ip, 2 datos a enviar y el 3ro es un log multilinea) , 1 label, 2 botones (enviar y desconectar), 1 timer, 1 winsock.

Public Llamada_Pendiente As Boolean
Public Datos_Pendiente As String
Public IP_Valida As Boolean
Public WS_cerradoerror As Integer

Private Sub Command1_Click()
Winsock1.Close ' Cierra conexiones previas
Llamada_Pendiente = True
Datos_Pendiente = Datos_Pendiente + Trim(Text2)
End Sub

Private Sub Command2_Click()
Llamada_Pendiente = False
Winsock1.Close
End Sub

Private Sub Form_Load()
Form1.Caption = "Programa Morse - " + Winsock1.LocalHostName + " - " + Winsock1.LocalIP + ":" + Trim(Str(Winsock1.LocalPort))

IP_Valida = False
Llamada_Pendiente = False
Datos_Pendiente = ""
WS_cerradoerror = 0

Winsock1.Close
Winsock1.Bind 3128, Winsock1.LocalIP

' Winsock1.LocalPort = 3128
' Winsock1.RemotePort = 3128

Winsock1.Listen

End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Text2.SetFocus
End If
End Sub

Private Sub Text2_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Call Command1_Click
End If
End Sub

Private Sub Timer1_Timer()
Select Case Winsock1.State
Case sckClosed
Label1 = "Cerrado"
If Llamada_Pendiente And Trim(Text1) <> Winsock1.LocalIP Then
Winsock1.RemoteHost = Trim(Text1)
'Winsock1.LocalPort = 3128
'Winsock1.RemotePort = 80
Winsock1.Connect
WS_cerradoerror = 0
End If
If WS_cerradoerror > 25 Then
Winsock1.Listen
WS_cerradoerror = 0
Else
WS_cerradoerror = WS_cerradoerror + 1
End If
Case sckOpen
Label1 = "Abierto"
Case sckListening
Label1 = "Escuchando"
Case sckConnectionPending
Label1 = "Conexión pendiente"
Case sckResolvingHost
Label1 = "Resolviendo host"
Case sckHostResolved
Label1 = "Host resuelto"
Case sckConnecting
Label1 = "Conectando"
Case sckConnected
Label1 = "Conectado (Con: " + Winsock1.RemoteHostIP + ")"
Case sckClosing
Label1 = "Cerrando la conexión"
'If WS_cerradoerror > 500 Then
' Winsock1.Listen
' WS_cerradoerror = 0
'Else
' WS_cerradoerror = WS_cerradoerror + 1
'End If
Case sckError
Label1 = "Error"
If WS_cerradoerror > 500 Then
Winsock1.Close
WS_cerradoerror = 0
Else
WS_cerradoerror = WS_cerradoerror + 1
End If
End Select
End Sub

Private Sub Winsock1_Close()
MsgBox ("el uruario cerro la conexion")
' Winsock1.Listen
End Sub

Private Sub Winsock1_Connect()
If Llamada_Pendiente Then
Winsock1.SendData Datos_Pendiente 'Envia los datos en espera
Text3 = "De:" + Winsock1.LocalIP + " Para:" + Winsock1.RemoteHostIP + " > " + Datos_Pendiente + Chr(13) + Chr(10) + Text3
Llamada_Pendiente = False
Datos_Pendiente = ""
End If
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
Text3 = "Coneccion establecida con " + Winsock1.RemoteHostIP + Chr(13) + Chr(10) + Text3
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim DatosRecibidos As String
If DatosRecibidos = "@Ok" Then
Winsock1.Close
Else
Winsock1.GetData DatosRecibidos
Text3 = "Remoto (" + Winsock1.RemoteHostIP + ") Dice: " + DatosRecibidos + Chr(13) + Chr(10) + Text3
Llamada_Pendiente = False
Winsock1.SendData "@Ok"
Winsock1.Close
End If
End Sub

Private Sub Winsock1_SendComplete()
Text3 = "Envio ok a:" + Winsock1.RemoteHostIP + Chr(13) + Chr(10) + Text3
Winsock1.Close
End Sub

fapper
07 de Abril del 2005
Existe una forma de cerrar el puerto a la fuerza?