PDA

Visualizza la versione completa : [C++] WinSock: trasferimento di big flows data


Yale
04-01-2006, 19:24
Ho il seguente problema:
nel programmare una LAN utilizzando C++ e winsock (senza passare per MFC) mi si presenta un problema di flusso!(adesso chiarisco)
Innanzitutto chiarisco che ho dato luogo a dei socket asincronici con WSAAsyncSelect.
Nel caso di invio di un singolo valore, per ipotesi, dal client verso il server,utilizzo direttamente 'send'; il lato server riceve la notifica FD_READ e procede quindi a prelevare il messaggio con recv.

Il PROBLEMA si pone quando voglio inviare un vettore elevato di dati,
nel mio caso specifico, ho un vettore di 500 dati double. Io procedo in questo modo:
1. attivo un loop che va da 1 a 500, ad ogni passaggio del loop, prelevo il dato (lo trasformo in char, lo protocollo) e lo invio con send.
Ad ogni passaggio del loop in sostanza invio un messaggio da 64 byte.

Questi, vengono ricevuti e visualizzati dal server, il problema è che quando il vettore supera gli 80 dati i rimanenti non vengono ricevuti.

SOLUZIONE SPARTANA: ho inserito un semplice Beep(100,10) nel loop in modo da rallentarlo, in tal caso i dati vengono ricevuti tutti...ma mi sempbra una cosa da terzo mondo.

Ora deve essere chiaro che ho l'esigenza di inviare pacchetti da 64 byte in quanto i dati che voglio inviare non sono dati statici e il vettore non è statico. voglio arrivare a gestire dati in realtime che potrebbero essere generati o meno e in qualsiasi epoca. Io in sostanza ho un generatore di valori che può creare o meno un numero variabile di dati. Il caso del loop dato un vettore fisso l'ho creato solo per estremizzare e vedere il caso in cui mi vengano prodotti molti valori in un infinitesimo di secondo.

COME POSSO SPEDIRE CONTINUAMENTE UN GROSSO QUANTITATIVO DI DATI SENZA AVERE DISPERSIONE???
credevo che FD_WRITE potesse aiutarmi , ma niente.

HELP

Yale
05-01-2006, 12:51
help me!

Yale
06-01-2006, 13:03
help me, please

Yale
11-01-2006, 18:37
:confused: :master: :cry: :cry: can you help me?

oregon
11-01-2006, 19:17
1) Come mai converti 1 double in 64 byte?

2) Quanto intendi debba essere veloce l'invio? Parli di "infinitesimo di secondo" ma la rete ha una velocita' "reale" ben definita che puo' essere un limite per la tua applicazione.

3) In ogni caso, per capire qualcosa in piu' del problema che hai attualmente, bisognerebbe vedere il codice che hai utilizzato ...

P.S. Non chiedere aiuto a ritmo continuo perche' un forum non e' una chat e non sempre si puo' o si vuole rispondere ...

Yale
12-01-2006, 10:22
1. converto un double in 64 byte in quanto vado a protocollare il dato, mi spiego meglio: invio dati attraverso send, il package che invio è una stinga che oltre a contenere il double convertito in char, contiene il codice dell'operazione che deve essere eseguita dal server una volta giunto il dato, il codice della matrice dove deve essere inserito il dato e le cordinate matriciali in cui deve essere inserito il dato. Ho assunto 64 byte come formato standard dei package, ma posso ridurlo benissimo a 32.

2. E' vero che la rete ha un limite ben definito. Ma se l'invio provoca l'attivazione di un loop il quale ad ogni passaggio spedisce un pacchetto da 64 byte. Ipotizzando che il loop sia di 1000 passaggi (ossia voglio inviare 1000 dati) io vado ad inviare 64000 byte in un infinitesimo in quanto la velocità di invio è determinata dalla velocità del loop che a sua volta e determinata dalla frequenza del processore.

E' quindi logico che in un infinitesimo di tempo mi trovo ad inviare più dati di quanti la banda sia in grado di supportare, ma a questo proposito mi chiedevo:
Ma il protocollo TCP/IP non prevede che se un dato non arriva, questo viene reinviato sino a quando non arriva?

In ogni caso pensavo di risolvere questo problema immagazzinando i dati in un buffer prima di essere inviati e di costruirmi io una procedura che regola il flusso di dati inviato attraverso dei buffer dinamici e un SetTimer.

3. Il codice per la Lan è sparso in un codice da 200 pagine per cui devi darmi il tempo di mettere assieme i punti salienti, in ogni caso:

a. creo socket attraverso le classiche funzioni SOCKET, bind..ecc
b. i socket sono asincroni...attraverso WSAAsyncSelect
c. i dati vengono ricevuti da WM_READ (recv), vengono deprotocollati e utilizzati;
d. i dati vengono spediti con send dopo essere stati protocollati;

NB: innanzi tutto grazie dell'interessamento, il fatto è che è da diversi giorni che aspetto una risposta e ogni volta che inserivo un help me era perchè passava qualche giorno e il post finiva dimenticato senza risposta in terza quarta pagina.

Loading