Newsgroup: it.comp.lang.visual-basic
Titolo: Problemi con Winsock e ricezione dati contemporanei

Ok la cosa non dovrebbe essere delle più semplici comunque proviamo.
Dal SC ho scaricato due progetti ("Online 1001 di Giagomo Perreca " e
"winsocb di Raffaele Tripodo") che sto rimaneggiando per creare una sorta di
Instant Messenger da rilaciare con licenza Open Source sul SC.
Ora veniamo al problema.
Se provo ad inviare (o ricevere) dati in contemporanea su più porte ho 2
errori:
1-Tutte le porte si mettono in attesa e l'ultima porta attvata comincia a
ricevere. Quando la porta finisce di ricevere tutti i dati, ricomincia il
trasferiento sulle porte in attesa (attenzione. Ogni porta ha un suo oggetto
winsock. quindi ho Winsock(1) per la porta 1500, Winsock(2) per la 1501,
ecc)
2-(questo è il problema principale) i dati in ricezione sulle porte si
mischiano. Mi sono accorto che trasferendo due MP3 in contemporanea, vengono
creati i file correttamente (anche la dimensione su disco è quella del file
originale), ma le canzoni si sentono a pezzi ed in un file ci sono pezzi di
canzone dell'altro file!
come posso risolvere la cosa?
Almeno vorrei risolvere il punto 2...
Grazie a chiunque voglia aiutarmi
PS se sapete come contattare l'autore originale di Winsockb, può darsi che
lui abbia una versione bugfix.
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
www.nicolaottomano.it


risposta ad occhio e non so se è la più corretta: hai impostato il binding
sul numero di porta (Winsock(0).bind [porta],[opzionale ip])?
la cosa è banale, ma è la prima cosa sensata che mi sia venuta in mente.
ciao ciao


binding? potresti spiegarti meglio per favore? (è da relativamente poco
tempo che lavoro con Winsock).
Grazie


ho controllato. non è questione di binding. non è presente nessuna
istruzione bing.
cos'altro potrebbe essere? Tieni conto che le prove le ho fatte trasferendo
2 file da 2 client aperti sullo stesso pc dove è aperto anche il server
(quindi lavoro virtualmente in rete ma praticamente sono in locale.)
bye


 come posso risolvere la cosa?
Probabilmente lo hai gia' letto, ma sulla guida c'e' scritto:
"Accettazione di più richieste di connessione
Il semplice server illustrato in precedenza è in grado di accettare 
un'unica richiesta di connessione. È tuttavia possibile accettare varie 
richieste di connessione utilizzando lo stesso controllo, creando una 
matrice di controlli. In questo caso non sarà necessario chiudere la 
connessione, ma sarà sufficiente creare una nuova istanza del controllo, 
impostandone la proprietà Index, e richiamare il metodo Accept per la 
nuova istanza.
Nel codice riportato di seguito si presuppone che sia stato inserito in 
un form un controllo WinSock denominato sckServer e che la proprietà 
Index di tale controllo sia impostata su 0. In questo modo il controllo 
farà parte di una matrice di controlli. Nella sezione Dichiarazioni 
viene dichiarata una variabile intMax a livello di modulo. Nell'evento 
Load del form, intMax è impostata su 0 e la proprietà LocalPort del 
primo controllo della matrice è impostata su 1001. Viene quindi 
richiamato il metodo Listen per il controllo, che viene pertanto messo 
in "ascolto". All'arrivo di ciascuna richiesta di connessione, il codice 
verifica se la proprietà Index è uguale a 0 (il valore del controllo in 
"ascolto"). In caso affermativo, il controllo in "ascolto" incrementa il 
valore di intMax e utilizza tale numero per creare una nuova istanza del 
controllo. La nuova istanza verrà quindi utilizzata per accettare la 
richiesta di connessione.
Private intMax As Long
Private Sub Form_Load()
    intMax = 0
    sckServer(0).LocalPort = 1001
    sckServer(0).Listen
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
       intMax = intMax + 1
       Load sckServer(intMax)
       sckServer(intMax).LocalPort = 0
       sckServer(intMax).Accept requestID
       Load txtData(intMax)
    End If
End Sub
"
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

Ma tu ti riferisci al progetto Online?
Il problema o ho sulla parte riguardante il progetto Winsockb.
Poi non ho capito un'altra cosa. il codice che mi hai postato dove dovrei
metterlo.
Scusa se ti faccio perdere ulteriore tempo ma non riesco proprio a cavare un
ragno dal buco....
bye


 
La citazione e' dalla guida di vb relativamente a winsock. Era solo un 
possibile indizio per controllare se il tuo codice e' corretto. 
Purtroppo nello specifico non ti posso aiutare.


Il punto 1 l'ho risolto creando a parte un eseguibile che viene richiamato
ogni volta che serve trasferire file (vi possono anche essere più task che
lavorano in contemporanea).
Anche il secondo problema, con alcuni accorgimenti l'ho risolto.
Ora però mi si presenta un problema più grosso.
Se il server non riceve il comando di eof non chiude il file e non dice che
il download è terminato.
In rete Lan la cosa non da problemi, ma se mi connetto con gente che va
lenta (e i pacchetti vanno anche loro lenti) allora l'eof va perso.
Ho cercato di risolvere la cosa con un feedback  (se il server riceve eof
allora risponde con UploadTerminato).
Quindi il client continua ad inviare eof finchè il server non risponde con
UploadTerminato.
Ma non so x quale motivo se ci si trova in reti congestionate l'eof non
arriva... (mentre in LAN va benissimo).
poichè anche tu (emmexx) hai FW, ti andrebbe di provare a connetterci tra
noi e lavorare con i sorgenti?
fammi sapere


 
Sono qui! :-)


azz! mi ero appena scollegato....
vabbč facciamo per domani pomeriggio.
