Problemas con la conexión TCP bajo WINSOCK en VB
Aquí tengo un ejemplo. Este es el servidor que uso para crear el software de chat LAN. Se implementa mediante una matriz de control dinámico. El número máximo de conexiones está actualmente limitado a 15, que por supuesto puede ser. cambió.
Este es solo el código del servidor, solo hay un formulario, el código del formulario es el siguiente:
Private intMax, XxintMax As Long 'Registrar subíndice de control de red
Dim yhs As Integer ' Registre el número de personas conectadas
Private Sub Command2_Click()
sckServer(intMax).Close
End Sub
Private Sub Form_Load( )
Conectar
Label1.Caption = "Número de usuarios actualmente conectados: 0"
intMax = 0
XxintMax = 1
sckServer(0).LocalPort = "15000"
sckServer(0).Listen
XinXi(0).LocalPort = "20000"
XinXi( 0).Escuchar
lianjieshu = 0
yhs = 0
Fin Sub
Sub formulario privado_Descargar (Cancelar Como entero) p>
Si sckServer(0).State Entonces sckServer(0).Close
End Sub
Private Sub xinxi_ConnectionRequest(Index As Integer, ByVal requestID As Long) 'Control de información
Dim indexi, indexb As Integer 'Encontrar control libre
Si Index = 0 Entonces
indexb = 1
Para indexi = 1 a XxintMax
Si Xxljzt(indexi, 1) = 0 Entonces
p> Salir para
Finalizar si
Siguiente indexi
Si indexb = 1 Entonces
XxintMax = XxintMax 1
indexi = XxintMax
Xxljzt(indexi, 1) = 1
'Else
'Ir a jz
Finalizar si p>
En caso de error Reanudar siguiente
Cargar XinXi (indexi)
jz: XinXi(indexi).LocalPort = "20000"
XinXi(indexi ).Aceptar requestID
Finalizar si
'MsgBox "Un usuario está conectado"<
/p>
End Sub
Private Sub xinxi_DataArrival(Index As Integer, ByVal bytesTotal As Long) 'El control de información tiene nueva información
Dim strdata, id, neirong, IP As String
Dim i As Integer 'ID de información de reenvío
XinXi(Index).GetData strdata, vbString 'Cuando lleguen los datos, llame al método GetData para recibirlos
Si Left(strdata, 1) = "T" Entonces
id = Trim(Mid(strdata, 4, Val(Mid(strdata, 3, 1))))
IP = Derecha(strdata, Len(strdata) - (Len(id) 3))
i = xinxifs(Val(id))
XinXi(i).SendData ( " T" amp; Len(Trim(Str(Xxljzt(Index, 2)))) amp; 1 ) = "F" Entonces
id = Trim(Mid(strdata, 4, Val(Mid(strdata, 3, 1))))
i = xinxifs(Val( id ))
XinXi(i).SendData ("F")
ElseIf Left(strdata, 1) = "J" Entonces
id = Recortar ( Mid(strdata, 4, Val(Mid(strdata, 3, 1))))
i = xinxifs(Val(id))
XinXi(i).SendData ( strdata )
Else
id = Trim(Mid(Trim(strdata), 2, Val(Left(Trim(strdata), 1))))
neirong = Derecha(Trim(strdata), Len(Trim(strdata)) - Len(id) - 1)
i = xinxifs(Val(id))
XinXi( i ).SendData (Len(Str(Xxljzt(Index, 2))) amp; Str(Xxljzt(Index, 2)) amp; neirong)
End If
End Sub
Subprivado xinxi_Close(Indexar como
Entero) 'Usuario fuera de línea
If XinXi(Index).State lt;gt; sckClosed Then
XinXi(Index).Close
End If p >
/p>
End Sub
Private Sub sckserver_ConnectionRequest(Index As Integer, ByVal requestID As Long) 'Control de inicio de sesión
Dim indexi, indexb As Integer 'Buscar control libre p>
Si Index = 0 Entonces
indexb = 1
Para indexi = 1 Para intMax
Si ljzt(indexi) = 0 Entonces p>
indexb = 0
Salir para
Finalizar si
Siguiente indexi
Si indexb = 1 Entonces
intMax = intMax 1
indexi = intMax
Else
Ir a jz
Finalizar si p>
Cargar sckServer(indexi)
jz: sckServer(indexi).LocalPort = "15000"
sckServer(indexi).Aceptar requestID
'Cargar txtData( intMax)
End If
'MsgBox "Un usuario está conectado"
End Sub
Private Sub sckserver_DataArrival( Índice como entero, ByVal bytesTotal As Long)
Dim strdata, sql, id, contraseña como cadena
sckServer(Index).GetData strdata, vbString 'Cuando lleguen los datos, llame a GetData método para recibirlo
id = Mid(strdata, 1, InStr(strdata, "\") - 1)
contraseña = Right(strdata, Len(strdata) - InStr( strdata, " \"))
sql = "seleccione * de mima donde ID=" amp Val(Trim(id)) amp;
'" amp; contraseña amp; "'"
Establecer cx = New ADODB.Recordset
cx.CursorLocation = adUseClient
cx.Open sql, conn, 2, 2
Si no es cx.EOF entonces
sckServer(Index).SendData ("1")
ljzt(Index) = 1
lianjieshu = lianjieshu 1
Label1.Caption = "Número de usuarios conectados actualmente:" amp Str(lianjieshu)
Xxljzt(xinxifree, 2) = Val(Trim; ( id))
Else
sckServer(Index).SendData ("0")
Finalizar si
Establecer cx = Nada
Me.Cls
Imprimir índice
End Sub
Private Sub sckserver_Close(Index As Integer) 'Desconectar inicio de sesión
Si sckServer(Index).State lt;gt; sckClosed Entonces
sckServer(Index).Close
Fin
ljzt(Index) = 0
Form1.Print Index amp; "close"
End Sub
Función privada xinxifree() As Integer 'El control de información encuentra una conexión libre
Atenuar i como entero
Para i = 1 a 15
Si Xxljzt(i, 1) = 0 Entonces
xinxifree = i
Salir de la función
Finalizar si
Siguiente i
Finalizar la función
Función privada xinxifs(id como número entero) como número entero 'Encuentre a quién se envió el mensaje
Dim i As Integer
For i = 1 To 15
Si Xxljzt(i, 2) = id Entonces
xinxifs = i
Salir de la función
Finalizar si
Siguiente i
Finalizar la función
Este es el código en el módulo:
Conexión pública como ADODB.Connection 'Tabla de información básica del usuario
Cx pública como ADODB.Recordset
lianjieyh pública ( )Como
Integer 'Registra el ID del usuario conectado
Public lianjieshu As Integer 'Registra cuántos usuarios han iniciado sesión
Public ljzt(1 a 15) 'Registra el estado inactivo de la red control y el número correspondiente del usuario de control
Público Xxljzt(1 a 15, 1 a 2) como entero 'Registrar estado de chat
Sub Connect()
Establecer conn = Nueva ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" amp App.Path amp; >
conn.Open
End Sub
Espero que te ayude