Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25

    [C] Scrittura non in ordine su file

    Ciao a tutti,
    vi scrivo perché ho bisogno di aiuto su un punto di un programma che sto scrivendo in C.
    Devo trasferire file da un server ad un client. Il trasferimento avviene per mezzo di pacchetti che possono arrivare anche in ordine sparso. Io ho bisogno di scriverli nell'ordine in cui li ricevo, ma posizionarli con la sequenza numerica giusta. Cioè se ho un file lungo 4 pacchetti e li ricevo in sequenza: 1-3-4-2, li devo scrivere in ordine temporale così, ma, ovviamente, posizionati come 1-2-3-4. Per fare questo dovrei preallocare tutta la memoria del file e poi spostarmi all'interno con fseek, altrimenti non posso scrivere nella posizione 3 se non ho prima scritto nella posizione 2. Quello che non so fare è la preallocazione del memoria del file.
    Qualcuno può aiutarmi?
    Non so se sono stato chiaro, cmq il sistema è MAC e Linux.

  2. #2
    a mio avviso è la parte relativa al server che dovrebbe riordinare i pacchetti prima di scriverli sul file. Capisco che tu voglia fare diversamente, ma secondo me viola il modello di programmazione stratificata

    io opterei piuttosto sul fare in modo che "la parte server" si occupi di passare i pacchetti al resto del programma solo quando ottiene la sequenza ordinata. Rimanendo in attesa altrimenti
    Per la cronaca, è esattamente quello che fa il protocollo ip

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    Il server invia i pacchetti in ordine, ma alcuni si perdono e vengono reinviati allo scadere di un timer, quindi il client li riceve dopo gli altri che invece non si sono persi.

  4. #4
    perfetto. A questo punto il server dovrebbe inviare allo "strato superiore", che in questo caso è il tuo programma, i pacchetti solo una volta che sono correttamente ordinati ( o meglio ancora, dovrebbe direttamente inviare ogni sequenza ordinata e mantenere in memoria gli altri pacchetti fuori sequenza aspettando che quelli precedenti vengano reinviati)
    Ti serve un protocollo a finestra

    alcuni esempi sono il protocollo go-back-n e il selective-repeat
    trovi parecchie informazioni e implementazioni cercando in internet

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    Esatto. Io ho realizzato il selective repeat con pacchetti UDP (avevo bisogno di UDP, non potevo usare TCP). La trasmissione funziona, i pacchetti arrivano tutti e, in caso di perdita, vengono reinviati. Il problema è il client, che appena li riceve li scrive, non in ordine logico, ma in ordine temporale, questo comporta un errore nel file ricevuto. Ho bisogno che mano a mano che riceva un pacchetto lo vada a scrivere nella posizione giusta puntata da fseek, calcolata in base al suo numero di sequenza, ma se il file viene creato mano a mano che arrivano i pacchetti questo non può scrivere nella posizione 3 se non è stata creata la posizione 2. Io devo prima crearle tutte e poi posso muovermi all'interno con l'fseek senza problemi, o almeno spero.

  6. #6
    ma come può il selective repeat funzionare in quel modo è sbagliato

    per essere un vero selective repeat deve inviare i pacchetti allo strato superiore (il tuo programma) SE E SOLO SE ha una sequenza ordinata pronta

    Il ricevitore controlla la correttezza della PDU. Se lo è la consegna al livello superiore, se non è in sequenza o la memorizza o la scarta, dipendendo dalla finestra di ricezione.
    non devi risolvere un problema di ordinamento dei pacchetti nella gestione dei file, è strutturalmente sbagliato. Trattandosi di un problema di rete deve essere risolto dal protocollo di rete e non da quello che c'è dopo. Questo perchè, in caso contrario, se ora volessi riutilizzare il protocollo che hai creato dovresti assicurarti che ogni programma che ci si interfaccia debba, per cavoli suoi, riordinare i pacchetti arrivati. Cosa caldamente sconsigliata.

  7. #7

    Re: [C] Scrittura non in ordine su file

    Originariamente inviato da Epiphone
    Devo trasferire file da un server ad un client.
    quanto possono essere grandi i file da trasferire?
    Se sono sufficientemente piccoli da poterli riordinare in RAM allora fallo in RAM, altrimenti scrivi i vari segmenti su un DB (basato o no, su file) e poi li riassembli scrivendoli ordinatamente nel file destinazione.

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    25
    I file non sono grandi, al massimo qualche centinaio di MB. Scusa la mia ignoranza. Come posso fare la seconda cosa che mi hai detto?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.