Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Controllo Winsock

Ciao a tutti,
ho un programma (in VB5) che deve fungere da server su una rete, e quindi
dovrebbe essere in grado di rispondere a più interrogazioni simultaneamente.
Per fare questo ho utilizzato il metodo indicato dal manuale: un array di
controlli winsock, dove il primo è sempre in ascolto su una porta, e a ogni
richiesta di connessione carica un nuovo controllo a lui uguale, usandolo
per ricevere la connessione. Dopodichè le procedure relative sono tutte
uguali (DataArrival, etc.), si differiscono solo per il parametro 'index'
che dovrebbe indicarmi a quale dei controlli si riferisce l'azione. Però
questo programma non mi funziona quando arrivano un po' di dati
contemporaneamente, spesso alcuni sono persi evidentemente perchè il
controllo non fa in tempo a leggerli.
Come devo fare? C'è qualcosa che ignoro sul controllo WinSock? C'è qualche
modo di agire sulla coda di dati che gli arrivano che non conosco? Qualsiasi
tipo di aiuto è ben gradito! grazie e ciao,
Alberto

...

Io ho il problema opposto: i dati arrivano tutti, ma le risposte non
arrivano ai
client. Ho messo un
    debug.print Winsock1.RemoteHostIP & "-> " & bufferSpedizione
dopo la
    Winsock1.SendData bufferSpedizione
e ho visto che il flusso di esecuzione è corretto (per ogni
client che ha inviato qualcosa viene eseguita una SendData), ma sul client
non
arriva nulla....
Qualcuno ha già affrontato (e magari risolto :P )  il problema?
Premetto che non posseggo manuali di VB, quindi il problema potrebbe essere
frutto della mia ignoranza e la soluzione molto ovvia.... :)
Grazie in anticipo
David

arriva nulla....
Da quello che dici il problema potrebbe allora essere nel GetData del
client, prova a controllare. Sei sicuro di non avere neanche la
Documentazione in Linea installata? Perchè lì, nella guida ai componenti, ci
sono esempi di utilizzo del controllo winsock.
Ciao,
Alberto

 
Io ho fatto delle prove e ho avuto l'impressione che il controllo
winsock non funziona correttamente se si accavallano delle senddata
cioe' se si esegue una senddata se la precedente non e' ancora terminata
e questo problema si verifica anche se le senddata si accavallano tra
indici diversi di uno stesso controllo winsock.
Marco.

Alberto
Ho dimenticato una cosa forse fondamentale :)
I client sono degli stupidissimi (!!! non avrei la piu' pallida idea di come
costruirli) VT220 in radiofrequenza con un lettore di codice a barre...
In pratica io (server) mando un prompt, aspetto la lettura del codice a
barre, la elaboro e rispedisco la risposta al terminale, in un loop
infinito.
Il tutto funziona egregiamente, salvo quando mi arrivano piu' dati
contemporaneamente: in questo caso elaboro tutto correttamente, ma arriva la
risposta ad un solo client... :(
Ciao!
David

Marco.
Ho avuto la stessa impressione :(
Purtroppo non sono riuscito a trovare il modo di fare una SendData
sincrona...
In casi abbastanza semplici basta un DoEvents dopo la send, ad esempio
For j=1 to numSockets
    socket(j).SendData "Ciao"
Next
non funziona, mentre
For j=1 to numSockets
    socket(j).SendData "Ciao"
    DoEvents
Next
funziona. Ma anche questo tentativo, nel mio progetto, e' fallito...
Ciao!
David

indici diversi di uno stesso controllo winsock.
Io ho avuto la stessa impressione però riguardo i getdata.
Ma a questo punto ho bisogno di aiuto, nel caso queste considerazioni
fossero vere: come si può fare per evitare questi errori del WinSock?
Ciao,
Alberto

 Ciao,
Non sono errori ma 'scelte implementative' mannaggia a loro !
Io mi ero costruito una coda dove bufferizzare le trasmissioni e quando
un senddata terminava , mi sembra che c'e' l'apposito evento ne avviavo
un'altra.
Temo che fosse dovuto al fatto che in un vettore di controlli winsock il
buffer di trasmissione , non so quello di ricezione, e' ! UNICO ! per
tutto il vettore.
Marco.

un'altra.
Grazie!!! Mi era sfuggito l'evento SendComplete (*shame*)!!!
Per non alterare troppo la struttura del mio progetto ho utilizzato una
variabile booleana ("semaforo" mi sembra che la chiamino :)). Prima di
eseguire una SendData eseguo un loop di test:
Do While Semaforo
    DoEvents
Loop
Semaforo = True
Socket.SendData iMieiDati
Sull'evento SendComplete semplicemente riporto Semaforo = False.
Dal momento che i burst di trasferimenti sono piccoli (max una schermata
21x8) il ritardo introdotto dal loop non si nota neppure...
Grazie ancora!
Ciao!
David