Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Invio file con i socket
Forum - C/C++ - Invio file con i socket

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
mariottide (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/09/2012

Segnala al moderatore
Postato alle 18:29
Venerdì, 07/09/2012
Salve, ho fatto un programma che in teoria scatta una foto dello schermo  e dovrebbe inviare il file (.bmp) dal server al client con i socket (su windows). In locale ho provato a vedere se funzionava e infatti funge. Ma aprendo il server su un pc esterno e provando a inviare il file sul mio client nel mio pc, la foto la scatta e la salva ma non me la invia, anzi si spegne. Vi posto il codice:
Codice sorgente - presumibilmente C/C++

  1. //Server
  2.  
  3. //Questa funziona fa uno screenshot e la salva come C:\\Windows\\dk.bmp
  4. cap();
  5. //Questa funzione invia il file al client
  6. sockServer.SendFile("C:\\Windows\\dk.bmp");
  7.  
  8. //client
  9. //riceve il file
  10. sockClient.ReceiveFile("Desktop.bmp");


I codici delle funzioni sono i seguenti:
Codice sorgente - presumibilmente C/C++

  1. //invia
  2. int Socket::SendFile(char*nomefile){
  3.          
  4.          char*buffer;
  5.          int size;
  6.          ifstream file;
  7.          file.open(nomefile, ios::in | ios::binary | ios::ate);
  8.          if(!file){
  9.               return 1;
  10.          } else{}
  11.              if(file.is_open()){
  12.                  file.seekg(0, ios::end);
  13.                  size = file.tellg();
  14.                  file.seekg(0, ios::beg);
  15.                  char*buf;
  16.                  buf = itoa(size, buf, 10);
  17.                  send(mySocket, buf, strlen(buf), 0);
  18.                  buffer = new char[size];
  19.                  file.read(buffer, size);
  20.                  send(mySocket, buffer, size, 0);
  21.                  file.close();
  22.              }
  23.  
  24. //riceve
  25. int Socket::ReceiveFile(char*nomefile){
  26.  
  27.           char*buffer;
  28.           char buf[4000];
  29.           int i = recv(mySocket, buf, sizeof(buf), 0);
  30.           buf[i] = '\0';
  31.           int size = atoi(buf);
  32.           buffer = new char[size];
  33.           ofstream file;
  34.           file.open(nomefile, ios::out | ios::binary | ios::ate);
  35.           recv(mySocket, buffer, size, 0);
  36.           file.write(buffer, size);
  37.           file.close();
  38.           cout << endl << "File ricevuto con successo!\n";
  39.           return 0;
  40.  
  41. }


Spero di essere stato chiaro visto che è la prima volta.

PM Quote
Avatar
mariottide (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/09/2012

Segnala al moderatore
Postato alle 22:12
Sabato, 08/09/2012
Qualcuno mi aiuta!! :d

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:56
Domenica, 09/09/2012
Se localmente funziona e tra due sistemi remoti no, allora il problema è nella connessione di rete.

Devi prima stabilire se il sistema remoto è contattabile sulla porta che hai scelto e se il router permette la comunicazione (in genere è necessario configurare la porta in ricezione).


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
mariottide (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/09/2012

Segnala al moderatore
Postato alle 12:39
Domenica, 09/09/2012
Grazie per la risposta. La connessione non ha problema. Infatti stringhe di testo le invia anche in remoto anche file di testo.

PM Quote
Avatar
mariottide (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/09/2012

Segnala al moderatore
Postato alle 12:45
Domenica, 09/09/2012
Un'altra cosa: in remoto invia file solo se specifico la grandezza (byte) del file da inviare, se invece lui non la conosce  in remoto non funziona mentre in locale sì. Non  capisco proprio dove sta il problema :noway:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:10
Domenica, 09/09/2012
Allora è necessario vedere il codice che utilizza le due funzioni per capire meglio.

Sulla questione della lunghezza del file mi sembra che sia anomalo il comportamento in locale.
Se non si sa quando finisce il file, come si fa a riceverlo correttamente (chiudendolo in ricezione)?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
mariottide (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/09/2012

Segnala al moderatore
Postato alle 19:49
Domenica, 09/09/2012
allora.. ho fatto la prova in remoto adesso e non invia nemmeno file di cui specifico la lunghezza. Forse hai ragione tu che la connessione ha un problema. Però mi chiedo il perché riesce anche in remoto a inviare stringhe di testo mentre i file no!  se vuoi vedere il codice lo postato sopra. Grazie comunque che mi rispondi.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:17
Domenica, 09/09/2012
Allora ... riassumiamo, altrimenti si fa confusione ...

- in locale, funziona tutto

- in remoto riesci ad inviare/ricevere stringhe ... con quale codice ?

- in remoto, nessun file viene inviato/ricevuto ... con il codice che hai mostrato


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
mariottide (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/09/2012

Segnala al moderatore
Postato alle 20:28
Domenica, 09/09/2012
Ciò che hai detto è vero. Il mio programma è una backdoor ma non la uso per danneggiare è solo una piccola ambizione che voglio raggiungere. Quindi non pensare che sono un lamer. Dunque il progetto consiste in 3 file:
- main.cpp e la main del progetto
- Socket.h creo le classi con le relative funzioni per il collegamento al server
- Socket.cpp qui riprendo le funzioni del Socket.h mettendo il loro codice
Spero che hai capito. Se vuoi ti allego i file però non lo so se è contro il regolamento.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo