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);