Sembra che tu stia commettendo il classico errore di presa. Il codice e la spiegazione forniti sembrano supporre che i socket gestiscano i messaggi. Non sono. Se utilizzato in questo modo, stai utilizzando streaming internet sockets, che fornisce uno stream , non i messaggi.
Non viene visualizzato alcun codice che trasmette l'invio effettivo, quindi suppongo che si limitino a pompare i dati di un file sull'altro lato e si chiuda la connessione. In quale altro modo saprai di aver trasferito con successo un intero file?
Questo insieme di regole che client e server devono seguire per scambiare utilmente i dati tramite socket è chiamato application protocol. È deve averne uno, altrimenti si invierà solo dati a $ deity sa dove, e non si avrà alcun controllo su di esso. Ciò significa che il server o il client sapranno cosa sta succedendo, invieranno e riceveranno i dati e sperano che tutto vada bene. Quindi non ci sono "poche righe" che devi aggiungere al tuo codice, dovrai ristrutturarlo interamente.
Ci sono molti modi per definire un protocollo di applicazione e molte opzioni tra cui scegliere, quindi vi mostrerò un arbitrario: una spiegazione testuale dei messaggi che hanno come prefisso un ID e una lunghezza del payload (se applicabile), sia in variabili numeriche non specificate. Ad esempio, è possibile scegliere interi interi senza segno a quattro byte little-endian.
I messaggi in questo formato sono noti come "Type/Length/Value" or TLV. Così definiamo questi messaggi:
ID Name Direction Description Payload
1 ServerHello Server -> Client The server sends this message None.
to every connecting client. Or maybe server or
protocol version.
2 MaxUpload Server -> Client Sent after the ServerHello. Maximum upload size
in bytes.
3 AllowedExts Server -> Client Allowed upload extensions, The allowed extensions.
comma-separated. Sent after
MaxUpload message.
10 IncomingFile Client -> Server There's a file coming. The file name.
11 FileUpload Client -> Server The file to upload. The file data.
Sent after IncomingFile.
Ora tutto quello che serve è quella di implementare questo protocollo di applicazione in server e client e il gioco è fatto.
È inoltre necessario decidere cosa fare se un client o un server non aderisce al prototipo. Ad esempio, può inviare un messaggio che non è possibile analizzare, un ID messaggio sconosciuto, una lunghezza messaggio che non si desidera supportare, un messaggio fuori ordine (FileUpload before IncomingFile) o un messaggio che non è conformare i messaggi inviati in precedenza, come un client che carica un file più grande di quanto il server abbia detto che accetterebbe o un'estensione non valida. Devi anche pensare a "conferma" o messaggi di risposta, come il server che dice al cliente "OK, vai avanti, invia il messaggio successivo".
Tutto sommato, si tratta di una molto ampia domanda e non ha risposto facilmente. Ho cercato di dirlo nel mio commento alla tua domanda, che è stata rimossa. Quindi qui hai la tua risposta.
È possibile ottenere ulteriori informazioni a riguardo sul Web, ad esempio Beej's Guide to Network Programming come collegato a Giorgi (assicurarsi di leggere l'intera guida) e Stephen Cleary's blog.
Per limitare le dimensioni del file basta aggiungere il contatore delle dimensioni totali dei dati, come "contatore = = 0; contatore + = recv;". Quindi, se il limite è superato, rilasciare il client con il messaggio appropriato. –
Voglio solo inviare la dimensione del file e i formati di file consentiti al client come sson come il client si connette in modo che il client possa inviare file di conseguenza @Alek Depler –
Hm, quindi è necessario creare il proprio protocollo client-server. Sia il client che il server possono inviare dati tra loro, è necessario suddividere tutti i dati di due tipi: le istruzioni del protocollo tecnico e i dati stessi. La risposta di "CodeCaster" è corretta –