REORDENAR ARRAY DE OBJETOS WINSOCK
estou desenvolvendo um servidor para um chat e estou com um problema tenho um array de winsocks ...e com dois usuarios conectados.....no array de wisocks 0 é o raiz...que recebe as conexões....1 é o user1.....2 é o user2.....se o user 1 desconectar...
o ultimo wonsock continua com indice de 2....e eu não consigo reconfigurar a ordem deles....bem....é bem dificil em uma rede pequena mas eu poderia descartar as posições desconectadas....e se houverem 32768 tentativas de conexão.!!!!!...eu perderia a conexão com todos os usuarios.....alguem sabe como reordenar a lista de indices desse array de winsocks !!!! ????>>>>>>>>>> ai vai uma parte do codigo onde da o erro....
'fecha winsock carregado se usuario desconectar
For cont = 1 To wsk.Count - 1
DoEvents
If wsk(cont).State = 0 Or wsk(cont).State = 8 Or wsk(cont).State = 9 Then
txtlog.Text = txtlog.Text & Time & wsk(Index).RemoteHostIP & " Desconectado" & vbCrLf
Unload wsk(cont)
End If
Next
'************aqui da o erro***************
'atualiza lista de winsocks
If wcontatual <> wsk.Count Then
Dim contador2 As Integer
lv.ListItems.Clear
contador = wsk.Count
For cont = 1 To (contador2 - 1)
DoEvents
Set lindex = lv.ListItems.Add(, , cont, 0, 0)
lindex.SubItems(1) = wsk(cont).RemoteHost
lindex.SubItems(2) = wsk(cont).RemotePort
If lv.SelectedItem.Text = "Conectado" Then
lindex.SubItems(3) = wState(wsk(cont).State)
End If
Next
End If
o ultimo wonsock continua com indice de 2....e eu não consigo reconfigurar a ordem deles....bem....é bem dificil em uma rede pequena mas eu poderia descartar as posições desconectadas....e se houverem 32768 tentativas de conexão.!!!!!...eu perderia a conexão com todos os usuarios.....alguem sabe como reordenar a lista de indices desse array de winsocks !!!! ????>>>>>>>>>> ai vai uma parte do codigo onde da o erro....
'fecha winsock carregado se usuario desconectar
For cont = 1 To wsk.Count - 1
DoEvents
If wsk(cont).State = 0 Or wsk(cont).State = 8 Or wsk(cont).State = 9 Then
txtlog.Text = txtlog.Text & Time & wsk(Index).RemoteHostIP & " Desconectado" & vbCrLf
Unload wsk(cont)
End If
Next
'************aqui da o erro***************
'atualiza lista de winsocks
If wcontatual <> wsk.Count Then
Dim contador2 As Integer
lv.ListItems.Clear
contador = wsk.Count
For cont = 1 To (contador2 - 1)
DoEvents
Set lindex = lv.ListItems.Add(, , cont, 0, 0)
lindex.SubItems(1) = wsk(cont).RemoteHost
lindex.SubItems(2) = wsk(cont).RemotePort
If lv.SelectedItem.Text = "Conectado" Then
lindex.SubItems(3) = wState(wsk(cont).State)
End If
Next
End If
Eu aconselharia a você, criar uma segunda array onde cada indice retornaria a um winsock, ficaria mais ou menos como o sistema de endereçamento virtual do windows, o que é referenciado é o endereço virtual, mas que no seu programa é traduzido para o endereço real, onde é aplicado ao winsock.
Solução melhor: procure por CSocketMaster na psc. é uma classe que simula bem o trabalho do winsock, com ela você poderá fazer arrays e controlar mais dinamicamente usando o comando Set.
Vamos la
ex : Voce tem o winsock(0) como base certo ?
ai , a medida que varias solicitações forem ecaminhadas vc vai acrecentadndo varios winsokcs assim:
um variavel contador
Contador = Contador +1
load Winsock(Contador)
Winsock.acept RequestID
ate ai tudo bem
Quando um usuário desconectar amarzene o numero do index do winsock em uma variavel ex : Dim Pos as integer
a proxima vez que o algum usuário solicitar conexao em vez de vc utilizar contador ,preencha a lacuna que ficou do winsock que foi desconectado pela ultima vez usuando a posição do winsock que foi desconectado pela ultima vez
assim :
load winsock(Pos)
Espero ter Ajudado
Quaquer Duvida
ex : Voce tem o winsock(0) como base certo ?
ai , a medida que varias solicitações forem ecaminhadas vc vai acrecentadndo varios winsokcs assim:
um variavel contador
Contador = Contador +1
load Winsock(Contador)
Winsock.acept RequestID
ate ai tudo bem
Quando um usuário desconectar amarzene o numero do index do winsock em uma variavel ex : Dim Pos as integer
a proxima vez que o algum usuário solicitar conexao em vez de vc utilizar contador ,preencha a lacuna que ficou do winsock que foi desconectado pela ultima vez usuando a posição do winsock que foi desconectado pela ultima vez
assim :
load winsock(Pos)
Espero ter Ajudado
Quaquer Duvida
Verdade, ótima solução essa do Cardoso =D
Melhorando: ao invés de uma variável somente, coloca uma collection com todos os winsocks desconectados.
valeu cardoso , valeu zerovalue.... juntei as duas ideias criei um endereço virtual para eles e um procedimento para reaproveitar winsocks fechados.... valeu !!!
Sinceramente eu gostei mais da resposta do cardoso =P, a que eu dei é até interessante, mas de implementação um pouco mais complicada, a dele é bem simples, e super fit.
Tópico encerrado , respostas não são mais permitidas