Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230

    [C] Errore trasmissione socket

    Ho scritto un sender UDP ed un receiver UDP. Il sendere invia dei file al Receiver.
    In pratica la modalità di trasmissione funziona così:
    invoco il server passandogli indirizzo destinazione e path del file da inviare ad esempio supponendo di stare sotto linux e di aver chaiamato sender il file eseguibile, da linbea di comando scrivo:
    ./sender 10.0.0.20 /home/prova.txt
    al ricevitore gli arriva nell'ordine:
    il nome del file (la stringa che identifica il nome del file in questo caso "prova.txt")
    la lunghezza
    il file in pacchetti da 4096 byte

    il mio problema è che in ricezione il nome del file arriva "tagliato" anzichè "prova.txt" ottengo "prov" , la stessa cosa vale se invio pluto.txt ottengo solo plut, in pratica e come se si ricevessero solo i primi 4 caratteri.
    Il sender invia correttamente il nome del file ossia prova.txt
    Vi riporto solo la parte di codice in cui il sender invia il nome del file e il receiver lo riceve.

    Codice PHP:
    sender.c

    int main 
    (int argcchar** argv){

      
    FILEfin;
      
    int sd
      
    struct sockaddr_in dest;
      
    char buf[BUFFSIZE];  /*buffer for socket*/
      
    unsigned long lengthfile_sizeencoded_file_sizechunk_size;
      
    time_t end,start;
      
    double internal
      
    charfilename

      if (
    argc != 3) {
        
    fprintf(stderr,"usage: IPdestination path \n");
       exit(
    1);
    }

      

      
    memset((char *)&dest0sizeof(dest));
      
    dest.sin_family AF_INET;
      
    dest.sin_port htons(PORT);
      
    dest.sin_addr.s_addr inet_addr(argv[1]); /*destination's address*/
     
      
    if ((sd socket(AF_INET,SOCK_DGRAM,0))<0) {
      
    perror("socket creation");
      }
      
    fin fopen(argv[2],"rb");
      if (
    fin != NULL){
          
     
          
    filename find_fileName(argv[2]);
          
          if(
    sendto(sdfilenamesizeof(filename), 0, (struct sockaddr*)&destsizeof(dest))<0){
          
    perror("error sending name file"); }
              
    .......

    }

    charfind_fileName(charpath){

     
    chartoken;
     
    token strtok(path"/");
     while(
    token != NULL) {
         if (
    strpbrk(token,".") != NULL){ // la string in cui c'è il "." identifica il nome del file
         
    break; } 
        
    token strtok(NULL"/"); 
      }
     return 
    token

    Codice PHP:
    receiver.

    int main 
    (int argcchar** argv){

      
    int sdsfamilystypesprotocol;
      
    struct sockaddr_in receivertheir_addr;
      
    socklen_t their_addr_len;
      
    unsigned long encoded_file_sizefile_size;
      
    FILEfout
      
    char filename[FILENAME];
      
    char path[PATHLENGTH] = "/home/"

      
        
    memset((char *)&receiver0sizeof(receiver)); /*clean */     
        
    receiver.sin_family AF_INET;
        
    receiver.sin_port htons(PORT);
        
    receiver.sin_addr.s_addr INADDR_ANY;
        
        if ((
    sd socket(AF_INETSOCK_DGRAM0))<0)
           
    perror("socket creation error"); 
        if (
    bind(sd, (struct sockaddr*)& receiversizeof(receiver))){
        
    perror("bind error");
        exit(
    1);
        }
        
    memset(filename0,sizeof(filename));
        if (
    recvfrom(sd,filenamesizeof(filename),0NULLNULL)<0){
             
    perror("receive file name error");
        } 
        
    strcat(path,filename);     <----non riesco ad ottenere il nome del file corretto 
        printf
    ("filename %s\n"filename);  
        
    printf("path %s\n"path); 

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il problema, sia in trasmissione che in ricezione, e' la

    sizeof(filename);

    Il sizeof restituisce la grandezza in byte del tipo di dato passato ... e filename e' un puntatore di 4 byte ...

    La sizeof NON restituisce il numero di caratteri della stringa puntata da quel puntatore ... per ottenere questo valore devi usare la strlen

    strlen(filename);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Grazie mille

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 © 2024 vBulletin Solutions, Inc. All rights reserved.