Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [c] Copiare file

    ciao..
    Ho un problema con un programma che ho scritto per copiarmi i file da tra due computer messi in rete!

    i file vengono letti bene, ma ricevutti male : riceve sempre un paio di byte in piu , è questo impedisce il corretto funzionamento del file....


    il sorgente è abbastanza lungo quindi posto solo il sorgente delle due funzioni che gestiscono il trasferimento:

    codice:
    
    void lettura_file ( FILE * file, char *nome_file) {
    
    WSADATA data; 
    int size, err;
    char buf[MAX_FILE], ip[32], c_size ;
    SOCKET sock;
    SOCKADDR_IN sock_in;
    
    
        err = WSAStartup(MAKEWORD(2,2), &data); 
    
        if ( err == SOCKET_ERROR) 
            printf("Libreria non inizializzata, ERRORE : %d\n", WSAGetLastError()); 
    
        sock = socket(AF_INET, SOCK_STREAM, 0); 
    
        if ( sock == INVALID_SOCKET) 
            printf ("Socket non creato corretamente, ERRORE %d", WSAGetLastError()); 
    
            sock_in.sin_family = AF_INET; 
            sock_in.sin_port = htons(222);
    
        printf("Inserisci indirizzo ip :"); 
        scanf("%s", ip); 
       // printf(ip);
             sock_in.sin_addr.S_un.S_addr = inet_addr(ip); 
    
        err = connect(sock, (SOCKADDR *)&sock_in, sizeof(sock_in)); 
    
        if ( err == SOCKET_ERROR) 
            printf("Connessione non avenuta, ERRORE : %d", WSAGetLastError());
        else 
            printf("Connessione avenuta\n"); 
            
            
        size = strlen(nome_file) +1;
        
        c_size = (char ) size;
        
        printf("%c", c_size); 
        
        
        send ( sock, nome_file, size, 0); 
        
        do {
        
        size = fread(buf, 1, MAX_FILE, file);
        
        printf("Dati letti : %d\n", size); 
        
        size = send( sock, buf, size, 0);
        
         printf("Dati inviati : %d\n", size); 
                
       }while(!feof(file)) ; 
    
    
       closesocket(sock); 
       WSACleanup(); 
    
    
    }
    
    
    
    
    
    void  scrittura_file () {
    
    FILE *file;
    WSADATA data; 
    SOCKADDR_IN sock_in, s_accept_in;
    SOCKET sock, s_accept;
    int err, size, size_dati, i, prova; 
    char buf[MAX_FILE], nome_file[100];
    
    
        err = WSAStartup(MAKEWORD(2,0), &data); 
    
        if ( err == SOCKET_ERROR)
            printf("Libreria non inizializzata, ERRORE : %d\n", WSAGetLastError()); 
            
        sock = socket(AF_INET, SOCK_STREAM, 0); 
        
        if ( sock == INVALID_SOCKET)
            printf("Socket non creato, ERRORE : %d\n", WSAGetLastError()); 
            
        sock_in.sin_family = AF_INET; 
        sock_in.sin_port =  htons(222); 
        sock_in.sin_addr.S_un.S_addr = INADDR_ANY; 
        
        err = bind( sock, (SOCKADDR *)&sock_in, sizeof(SOCKADDR)); 
        
        if ( err == SOCKET_ERROR) 
            printf("Funzione bind non riuscita, ERRORE : %d\n", WSAGetLastError()); 
        
        err = listen(sock, 1); 
        
                     
                    
        if ( err == SOCKET_ERROR) 
            printf("Funzione listen non riuscita, ERRORE : %d\n", WSAGetLastError()); 
        
        size = sizeof(SOCKADDR_IN);
        s_accept = accept(sock, (SOCKADDR *)&s_accept_in, &size); 
        
        if ( s_accept == INVALID_SOCKET) 
            printf("Socket accept non creato, ERRORE : %d\n", WSAGetLastError()); 
        else 
            printf("Sockey connesso, ip : %s\n", inet_ntoa(s_accept_in.sin_addr));
            
        // NON FUNGE
            
        file = fopen("prova_coppia.doc", "wb");
        
        recv(s_accept, nome_file, 100, 0); 
        
        
        printf("Il nome del file e' : %s", nome_file);
            
        
         
        for (;;) {
        
        size_dati = recv(s_accept, buf, MAX_FILE, 0); 
        
        if ( size_dati == SOCKET_ERROR) 
            printf("Funzione recv : %d\n", WSAGetLastError()); 
                
        printf("Dati ricevuti : %d\n", size_dati); 
            
        size_dati =  fwrite(buf, 1, size_dati, file);  
        
        printf("Dati scritti : %d\n", size_dati);
        
        prova = feof(file);
        
        printf(" EOF presente : %d\n",prova);  
        
        prova = ferror(file); 
        
        printf(" ERRORE presente : %d\n", prova); 
        
        
        if (  size_dati != 100) 
        break;
        
        
        
        
        }
         
            
    }
    grazie....

  2. #2
    Non ho guardato con attenzione il codice che hai postato, ma sei sicuro di aprire il file di input e quello di output in modalità binaria?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Si entrambi i file sono aperti in modalita binaria.

    questa è la funzione che gestisce il file di input :

    codice:
    void gestione_file ( char *indirizzo){
    
    
    FILE * file; 
    char *nome_file; 
    
    puts(indirizzo); 
    
    
        file = fopen(indirizzo, "rb");
        nome_file = r_nome_file(indirizzo); 
        
        printf("Il nome del file é : %s!\nLunghezza : %d\n", nome_file, strlen(nome_file)); 
        
        
        if ( file == NULL) 
            printf("File non aperto corretamento\n"); 
        else {
            printf("File OK\n"); 
            lettura_file(file, nome_file); 
            fclose(file);
        }

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.