no sabia como poner el titulo, espero que almenos sea orientativo para este problema que tengo,
el problema es que me he quedado atascado, estaba haciendo esto:
tenemos una aplicacion servidor, la cual quiere conectar por el puerto 69 a un cliente, para que el clente soporte varias conexiones por ese unico puerto, hay que hacer algun sistema, y entonces el programa con el que tengo dudas hace esto:
escucha y acepta conexiones por el puerto 69, una vez establecida una conexion, pone a escuchar otro puesto "6800", mandando al servidor conectar por ese nuevo puerto, una vez establecida esta segunda conexion, cierra el puerto 69 y lo deja otra vez ala escucha para otra conexion,
cuando otro servidor conecta por el puerto 69, repite el proceso anterior, pero sumando 1 al puerto 6800, asi cada vez que se repite el proceso se van conectando realmente asi con el programa:
servidor---------6800-programa
servidor---------6801-programa
servidor---------6802-programa
servidor---------6803-programa
servidor---------6804-programa
etc...
hasta aqui perfecto, ala vez que se van estableciendo estas conexiones por orden, tambien se muestra graficamente en un listview, de esta manera:
N | nombre | ip | ping |
------------------------------------------------------
1 | fulanito | 127.0.0.1 | 235 |
------------------------------------------------------
2 | xenon | 192.168.0.1 | 246 |
------------------------------------------------------
3 | pepito | 192.168.0.2 | 127 |
------------------------------------------------------
4 | lol | 192.168.1.5 | 169 |
-------------------------------------------------------
perimero, el primer elemento de la lista es un numero que quiere decir el orden segun fueron conectandose, es igual a el puerto 6800 + item de la columna, osea la conexion 3, de pepito, usaria el puerto 6803 , ok? hasta aqui todo perfecto, ahora viene cuando la matan ( pongo tantos pelos y señales, para queme podais dar una ayuda mejor )
bueno, el tema a conseguir es este: quiero que ahora, al pinchar en el grafico con el numero, el nombre y eso, que cuando pinche en el numero de alguno, este se conecte a un cliente, todo bien, al pinchar por ejemplo en 3(pepito) manda al cliente escuchar por el puerto "6903"( 100 mas que 6803 ) y manda a su vez al servidor que se conecte a ese puerto,
una vez hecho esto, en el listview se sigue viendo como que esta conectado! entonces puese que despues de conectar con el cliente, borrara esa linea quedando asi:
N | nombre | ip | ping |
------------------------------------------------------
1 | fulanito | 127.0.0.1 | 235 |
------------------------------------------------------
2 | xenon | 192.168.0.1 | 246 |
------------------------------------------------------
4 | lol | 192.168.1.5 | 169 |
-------------------------------------------------------
ahora queda mal! feo, el 4 deberia ser 3, pues puse que se pusieran ordenados 1,2,3, en vez de 1,2,4, con lo cual se jode el invento, ya que para saber que numero de puerto ay que usar, lo identifico con el ITEM, el numero que aparece en el listview, asi ahora el 4(lol) que ahora es 3(lol) usaria el 6904 y no el 6903, con lo cual no se arreglarlo
entonces pensareis, pues dejalo asi que tampoco queda tan mal!! pero TAMPOCO PUEDO, por que si ahora pincho en el 4(lol) tiene como INDEX "3" y para borrar esa linea se usa el INDEX de el listview ( se me entiende? )
los elementos cogen un index, que es igual a su posicion en el listview, si borro uno, lo que hago es coger como dato el numero que le pongo para identificarlo yo, por que es el mismo que el index, pero el programa solo sabe identificar cada linea por su index, asi cada linea tenia su index IGUAL a su numero de identificacion, escepto si borro una linea Y NO LA ORDENO!
fijaos ahora lo importante que me era ordenar el numero de identificacion despues de borrar uno!! para que tengan el mismo index y poder seguir borrando el que yo quiera cuando quiera!!
la putada esque no puedo tener las 2 cosas! poder borrar alguna linea y conectarme a alguna linea
ejemplo:
si borro la 3, se queda como vimos arriba, 1 , 2 , 4
ahora si quiero conectarme al 4, lo tengo facil por que uso su numero de identificacion para saber que ese esta pillado por el 6804 y debera conectar al 6904, pero ahora no puedo borrar el 4 si pincho en el, conectaria, pero no podria borrarlo, por que solo habria 3 elementos con index 1, 2 y 3, y si le digo que borre 4, la unica forma que tengo de saber que el 4 es el 4, es por su numero que le pongo de identificacion, con lo cual quedaria asi:
quita la linea (item) 'item es igual al valor de la linea, en este caso 4, y ahora como el parametro de entreparentesis queme pide es el index, le doy el 4, y me dice obviamente, que el index esta fuera del rango, pero yo no se como coño hacer para que sepa que el 4 tiene de index 3, o que al reordenar todo, el index esta bien, pero entonces como coño hago paque sepa que no conecte al 6903 si no al 6904
HE AQUI LA DUDA!!!
69 ------- (programa) 6801 ------cliente----- 6901
69 ------- (programa) 6802 ------cliente----- 6902
69 ------- (programa) 6803 ------cliente----- 6903
69 ------- (programa) 6804 ------cliente----- 6904
se entiende? ya se que es un lio tremendo y que me enrrollo muchisimo, pero para que se me pueda ayudar, tenia que esplicarlo todo bien, y ahora os pongo el codigo para que lo veais mejor!!
PROGRAMA QUE ADMINISTRA
Código:
Dim Index As Integer
Dim i As Integer, filedata2 As String, filesize As Long
Dim cuenta As Integer, conexiones As Integer, conx() As Integer
Private Sub Command1_Click()
Open "d:\txt.txt" For Binary As #1
filedata2 = Input(LOF(1), 1)
Close #1
filesize = Len(filedata2)
ws(1).SendData "oye" & filesize
error:
End Sub
Private Sub Form_Load()
ws(0).LocalPort = 69
ws(0).Close
ws(0).Listen
'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ListView1.View = lvwReport
With ListView1.ColumnHeaders
.Add , , "nº", 330, 0
.Add , , "Pc", 1700, 2
.Add , , "Ip", 1700, 2
.Add , , "Ping", 740, 2
.Add , , "Versión", 700, 2
.Add , , "S.O", 770, 2
End With
Me.ListView1.GridLines = True
'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
End Sub
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
On Error GoTo error
Dim lol As Integer
Shell (App.Path & "\cliente241.exe " & Item + 6900), vbNormal
Espera (2)
ws(Item).SendData "ñconñ" & Item + 6900
'lol = Item
'ListView1.ListItems.remove (lol)
'lol = 1
'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
'bucle:
'If lol <> Me.ListView1.ListItems.Count Then
'Me.ListView1.ListItems.Item(lol) = lol
'lol = lol + 1
'Else
'Me.ListView1.ListItems.Item(lol) = lol
'GoTo sal
'End If
'GoTo bucle
'sal:
'fffffffffffffffffffffffffffffffffffffffff
error:
End Sub
Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)
ws(Index).Close
ws(Index).Accept requestID
Text2.Text = "Conectado" & Index
End Sub
Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim datos As String, dato As Variant
ws(Index).GetData datos
Text1.Text = Text1.Text & datos & vbCrLf
If datos = "ok" Then
i = i + 1
Load ws(i)
datos = Index + 6800
ws(i).LocalPort = datos
ws(i).Close
ws(i).Listen
ws(0).SendData "cone" & datos
End If
If Left(datos, 2) = "ya" Then
ws(0).Close
ws(0).Listen
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
dato = Split(datos, "ñ")
With Me.ListView1.ListItems.Add(, , i)
.SubItems(1) = dato(1)
.SubItems(2) = dato(2)
.SubItems(3) = dato(3)
.SubItems(4) = dato(4)
.SubItems(5) = dato(5)
End With
End If
End Sub
SERVIDOR
Código:
Dim archivo As String, por As String, cion As Long, copon As Long
Private Sub Form_Load()
ws.RemotePort = 69
ws.RemoteHost = "127.0.0.1"
End Sub
Private Sub Timer2_Timer()
If (ws2.State <> 7 And ws3.State <> 7) Then
ws.Close
ws.Connect
End If
End Sub
Private Sub ws_Connect()
ws.SendData "ok"
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
ws.GetData datos
If Left(datos, 4) = "cone" Then
datos = Mid(datos, 5)
ws2.Close
ws2.RemotePort = datos
ws2.RemoteHost = "127.0.0.1"
ws2.Connect
GoTo error
End If
error:
End Sub
Private Sub ws_Close()
ws.Close
End Sub
Private Sub ws3_Close()
ws3.Close
End Sub
Private Sub ws2_Connect()
ws2.SendData "yañvictimañ217.127.184.212ñ234ñ2.4ñon"
End Sub
Private Sub ws2_DataArrival(ByVal bytesTotal As Long)
Dim dato As String
ws2.GetData dato
If Left(dato, 5) = "ñconñ" Then
ws3.RemotePort = Right(dato, Len(dato) - 5)
ws3.RemoteHost = "127.0.0.1"
ws3.Close
ws3.Connect
ws2.Close
End If
End Sub
CLIENTE
Código:
el cliente es solo un programa que escucha por el puerto que le digas y acepta la conexion
muchas gracias, si te as leido toda esta parrafada, solo para ver si podrias ayudarme, pues ese gesto ya te lo agradezco mucho, tienes mas paciencia que un santo!!, y si encima puedes ayudarme en este rompecabezas, aun te lo agradecere mas
Un Saludo!!!