Newsgroup: it.comp.lang.visual-basic
Titolo: Stranezza ListBox

Ciao ragazzi, non riesco proprio a capire per quale motivo non
funziona questo semplice codice; la situazione e':
carico un controllo Winsock (con proprieta' index=0) sulla mia form,
e lo metto in attesa sulla porta1. Ad ogni richiesta di connessione
carico un altro Winsock e gli faccio accettare la connessione,
cosicchè il winsock 0 e' sempre in attesa, inoltre aggiungo una riga
alla ListBox List1. Invece quando il client chiude la connessione 
cioe' al verificarsi dell'evento Close, elimino una riga alla ListBox.
E fin qui tutto bene. La cosa strana che succede e' questa:
quando un client si connette, aggiunge correttamente una riga
alla ListBox e quando questo si disconnette la toglie correttamente,
poi pero' se provo a far connettere un altro client, il collegamento
avviene con successo ma non mi aggiunge la riga alla List Box !!
Come e' possibile? 
Private Sub Form_Load()
On Local Error Resume Next
    Winsock1(socket).Close
    Winsock1(socket).LocalPort = 1
    Winsock1(socket).RemotePort = 0
    Winsock1(socket).Listen
    Label1.Caption = "Sono in ascolto sulla porta 1"
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal
requestID As Long)
socket = socket + 1
Load Winsock1(socket)
    Winsock1(socket).Accept requestID
    Label1.Caption = "E' arrivata una richiesta servita dal sock n " &
socket & "il sock 0 è sempre in attesa"
    List1.AddItem "Utente : " & socket
End Sub
Private Sub Winsock1_Close(Index As Integer)
List1.RemoveItem (Winsock1(Index).Index - 1)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Dim n As Integer
    For n = 0 To socket
    Winsock1(n).Close
    Next
End Sub
Grazie a chi puo' aiutarmi
Ciao ciao

Ciao a tutti, non riesco a capire perche' non funziona questo semplice
codice, la situazione e' questa:
carico un controllo Winsock (con proprieta' index=0) sulla mia form 
e lo metto in attesa sulla porta 1, ad ogni tentativo di connessione,
carico un altro winsock e gli faccio accettare la connessione,
cosicche' il winsock 0 e' sempre in attesa,  inoltre, aggiungo una
riga alla ListBox List1. Quando il Client chiude la connessione, cioe'
al verificarsi dell'evento Close, elimino una riga dalla ListBox.
E fin qui tutto bene, il fatto strano e' questo: si connette un
client, e aggiunge correttamente una riga alla List Box, quando questo
si disconnette, elimina correttamente una riga alla ListBox, poi pero'
se provo a far connettere un altro client, non mi aggiunge piu' la
riga alla ListBox, come e' possibile??
Il codice e' questo:




Grazie mille a chi puo' aiutarmi
Ciao ciao

 End Sub
Possiamo ipotizzare che quanto sopra si verifichi ad ogni nuova connessione?
Se sì, possiamo anche essere certi (salvo possibili errori nelle 2/3
istruzioni precedenti non controllati dalla routine, ma magari intercettati
da altre a livelli precedenti) che il List1.Additem si verifichi.
Allora possiamo anche ipotizzare che il nuovo elemento, pur correttamente
aggiunto, non risulti visibile solo perchè il coda alla ListBox con
dimensioni verticali tali da non includerlo nella parte visibile?

[*Sanchez*=
ciprov...@nonsipuomaisapere.it
] ha il pepe al culo.

 [*Sanchez*=
ciprov...@nonsipuomaisapere.it
] ha il pepe al culo.
ROTFL
MIk



Bella questa Lupo, ho fatto un po' di casini con i post, me la sono
meritata. Ciao Ciao

 ha scritto nel messaggio
news:3f670107...@powernews.libero.it...

Secondo me è dovuto al fatto che fai accettare la socket da un altro
controllo (quello che carichi al volo nell'evento ConnectionRequest).
Forse la prima volta te lo fa fare ma poi arrivano i casini; è si vero che
al TCP/IP interessa solo su quale IP-Porta-MacAddress mandare l'Ack ma devi
considerare che stai usando il "controllo Winsock di MS" per cui qualche
problemino a fare queste diavolerie potrebbe averlo ...
ti ripeto : è una mia supposizione.
Che senso ha avere solo il controllo ad indice 0 in listen ? cosa ti cambia
?
poi prova ad utilizzare le porte libere per le applicazioni (non la 0 e la 1
occupate da chissà quale protocollo) .. ora non ricordo ma sopra la 1024
dovrebbero essere libere.
Saluti

sě, confermo. Un libro di sicurezza che sto leggendo dice che le porte dalla
1024 in poi sono libere per le applicazioni
good coding!!!
p.s.
togli quell'On Error Resume Next e metti una bella routine che ti logga
eventuali errori di run-time, ti prego!!!
[firmato, Comitato Abolizione Tempestiva On Errore]
-- 
Damiani Liborio Igor
ig...@igordamiani.it
 - 
soft...@igordamiani.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262



No, le dimensioni della ListBox sono grandi a sufficienza. Il problema
secondo me e' che il nuovo elemento non lo aggiunge proprio, infatti
quando poi disconnetto il Client, mi da' errore perche' tenta di
eliminare una riga che in effetti non c'e'.
Non saprei, se qualcuno e' cosi' gentile da copiare e incollare il
codice in un progetto e provare se da' lo stesso errore, gliene sarei
particolarmente grato! Ciao Ciao



Grazie ragazzi, non vi preoccupate non usero'  la porta 1. Questo era
solo un esempio per provare il funzionamento del tutto. Stessa cosa
per l' On Error Resume Next. Ciao Ciao

 eliminare una riga che in effetti non c'e'.
Ok, ma avevi prima detto che "tutto bene" anche quando si disconnette.
Il punto allora è che l'elemento non viene aggiunto.
Fai una cosa: Nell'evento di connessione aggiungi al listbox qualcosa che ti
dica se ci passa, come primissima istruzione e, giusto per capire, metti
anche un esplicito controllo d'errore.
Se, alla seconda connessione e/o secondo client, non si scatena l'evento
ConnectionRequest non so davvero cosa dirti, viceversa il birillo da
abbattere sta là dentro, in quelle 3/4 istruzioni. Sarà mica quel load di un
nuovo indice di winsock con un numero già esistente che non hai Unload-ato?

?
Non saprei, ho fatto in questo modo così ho sempre un socket in attesa
in modo tale da poter accettare connessioni multiple cioe' :ho il
socket 0 in attesa e ogni volta che arriva una nuva richiesta di
connesione, carico un nuovo socket e gli faccio accettare la
connessione. In alternativa avrei potuto assegnare tale connessione al
socket 0 e poi caricare un nuovo socket e metterlo in listen. Credo
che sia piu' o meno la stessa cosa, o sbaglio? Nel senso, tale
strategia e' giusta o ce n'e' una migliore? Ovviamente ho fatto cosi'
per evitare di caricare in anticipo molti socket che assorbono molte
risorse.
Ciao ciao

nuovo indice di winsock con un numero già esistente che non hai Unload-ato?
Quando faccio Load Winsock1(socket + 1), sto caricando un nuovo
winsock con un numero di indice che non puo' essere gia' esistente,
(almeno credo)
Ciao ciao

 (almeno credo)
Assicurati di eliminare quel "almeno"...
In definitiva, mi concentrerei su questo (sicuro che la listboc non sia
sortata).
Private Sub Winsock1_Close(Index As Integer)
List1.RemoveItem (Winsock1(Index).Index - 1)
End Sub
L'index di Winsock1(Index) non è ancora Index?
Se sì,  List1.RemoveItem (Index - 1)
Per non sapere nè leggere nè scrivere, io scandaglierei gli elementi di
List1 (da 0 a ListCount-1) alla ricerca di quello che ha contenuto (List)
pari a "Utente : " & socket (come da AddItem) e rimuoverei quello.

 risorse.
Rileggendomi, mi sa che sono stato un po' sgarbato ...
comunque sia .. utilizzi i socket in modo strano ... io tenderei a fare le
cose un po' piů semplici
ti metti in listen per una socket quindi aspetti che il canale sia aperto
(dopo l'accept), quindi carichi un'altra istanza del controllo  e ripeti il
tutto ...
io cambierei anche il port address ogni volta (incrementandolo).
Comunque magari ha ragione Lupo : č solo un problema di visualizzazione.
Facci sapere
Saluti

Ciao ragazzi, 2 parole: sto impazzendo.
Allora, seguendo i vostri consigli ho cambiato il modo di usare i sock
e incremento anche i numeri di porta; inoltre ho cambiato il modo in
cui elimino una riga dalla ListBox. Il problema pero', persiste.
La cosa bella e' che ho messo una label per controllare le righe della
ListBox (Label2) dopo la seconda connessione e, udite udite, alla
seconda connessione nella Label mi visualizza correttamente anche il
valore "Utente: 2"  (e quindi vuol dire che lo ha aggiunto) ma nella
ListBox non compare!!! 
A questo punto sono praticamente sicuro che, come da voi supposto, si
tratta di un problema di visualizzazione, ma mi chiedo, come e'
possibile se comunque la prima riga la aggiunge? Avrei capito se non
avesse aggiunto neanche la prima, ma perche' la prima si e le altre
no??? Mistero.
Dim porta As Integer
Private Sub Form_Load()
porta = 1025
On Local Error Resume Next
    Winsock1(socket).Close 
    Winsock1(socket).LocalPort = porta
    Winsock1(socket).RemotePort = 0
    Winsock1(socket).Listen
    Label1.Caption = "Sono in ascolto sulla porta 1025"
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Dim n As Integer
    For n = 0 To socket
    Winsock1(n).Close
    Next
End Sub
Private Sub Winsock1_Close(Index As Integer)
  Dim w As Integer
      For w = 0 To List1.ListCount
          If List1.List(w) = "Utente : " & socket Then
              List1.RemoveItem (w)
         End If
      Next w
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal
requestID As Long)
    Winsock1(socket).Close
    Winsock1(socket).Accept requestID
    Label1.Caption = "E' arrivata una richiesta servita dal sock di
indice " & socket
    socket = socket + 1
    porta = porta + 1
       Load Winsock1(socket)
       Winsock1(socket).LocalPort = porta
       Winsock1(socket).Listen
 
    List1.AddItem "Utente : " & socket
    Dim a As Integer
    For a = 0 To List1.ListCount
    Label2.Caption = Label2.Caption & List1.List(a)
    Next a
 
End Sub
Ciao e grazie ancora!

 no??? Mistero.
E se la routine che lo toglie dal listbox venisse eseguita alla sveltissima
e la listbox, magari pur rinfrescata, non lo facesse vedere o, meglio,
facesse vedere il risultato finale?
Pur mantenendo le cose come stanno, prova a mettere un secondo listbox (non
sortato) nel quale aggiungi, anzi, accodi, tutti i passaggi e non togli mai
niente. Quello č il tuo vero log. Almeno ci si toglie il dubbio...


Ok, perfetto, ti ringrazio, la soluzione sembra essere alle porte.
Ho messo un secondo ListBox dove non tolgo mai niente e 
funziona, cioe' aggiunge anche la seconda riga; deduzione: il problema
sorge quando vado a eliminare una riga; 
Private Sub Winsock1_Close(Index As Integer)
Dim w As Integer
For w = 0 To List1.ListCount
If List1.List(w) = "Utente : " & socket Then
List1.RemoveItem (w)
End If
Next w
End Sub
Sia questo metodo, sia quello che adottavo prima non vanno bene, ora
pero' non saprei come risolvere...
Ciao ciao

niente. Quello č il tuo vero log. Almeno ci si toglie il dubbio...
Ok, perfetto, ti ringrazio, la soluzione sembra essere alle porte.
Ho aggiunto un secondo ListBox dove non tolgo mai niente e funziona
cioe' agginge anche la seconda riga; deduzione: il problema sorge
quando vado ad eliminare una riga.
Private Sub Winsock1_Close(Index As Integer)
Dim w As Integer
For w = 0 To List1.ListCount
If List1.List(w) = "Utente : " & socket Then
List1.RemoveItem (w)
End If
Next w
End Sub
Sia questo metodo, sia quello che usavo in precedenza non fanno
funzionare il ListBox dopo l'eliminazione di una riga, 
ora pero' non saprei come risolvere...
Ciao Ciao

 pero' non saprei come risolvere...
Cosa significa "non vanno bene"?
Innanzi tutto, certamente, For w=0 To List1.ListCount-1
Poi, siamo sicuri di socket? Che non sia Index?
Mi pare che socket cresca sempre, ma che il vero "identificatore" di ogni
winsock1 sia Index.
Ho la sensazione che tu debba rivedere l'intera logica e, in particolare, la
relazione che c'è, se c'è, fra i valori di socket e Index e quanto metti nel
listbox per poi toglierlo.
Io, in tutta franchezza, non so bene come funzioni il winsock, come e quando
si verificano gli eventi..., insomma, non sono in grado di interpretare il
tuo programma.

tuo programma.
Ops, scusa per il doppio post...
Ok grazie Lupo, ancora una volta hai avuto ragione.
(sono proprio un pivello!) L'errore stava proprio nell'uso di socket,
infatti il vero "identificatore" di winsock1 e' proprio index e ora
funziona:
Private Sub Winsock1_Close(Index As Integer)
Dim w As Integer
For w = 0 To List1.ListCount - 1
If List1.List(w) = "Utente : " & Index + 1 Then
List1.RemoveItem (w)
End If
Next w
End Sub
Ti ringrazio ancora per tutti gli aiuti.
E fu cosi' che si risolse il mistero della ListBox...
Ciao ciao