REORDENAR ARRAY DE OBJETOS WINSOCK

USUARIO.EXCLUIDOS 30/04/2005 22:48:13
#81184
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

USUARIO.EXCLUIDOS 30/04/2005 23:34:10
#81186
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.
USUARIO.EXCLUIDOS 01/05/2005 00:31:04
#81191
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.
USUARIO.EXCLUIDOS 01/05/2005 13:26:52
#81219
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






USUARIO.EXCLUIDOS 01/05/2005 15:22:22
#81228
Verdade, ótima solução essa do Cardoso =D
USUARIO.EXCLUIDOS 01/05/2005 16:55:16
#81230
Melhorando: ao invés de uma variável somente, coloca uma collection com todos os winsocks desconectados.
USUARIO.EXCLUIDOS 01/05/2005 20:05:34
#81238
valeu cardoso , valeu zerovalue.... juntei as duas ideias criei um endereço virtual para eles e um procedimento para reaproveitar winsocks fechados.... valeu !!!
USUARIO.EXCLUIDOS 01/05/2005 21:19:47
#81243
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