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 argc, char** argv){
FILE* fin;
int sd;
struct sockaddr_in dest;
char buf[BUFFSIZE]; /*buffer for socket*/
unsigned long length, file_size, encoded_file_size, chunk_size;
time_t end,start;
double internal;
char* filename;
if (argc != 3) {
fprintf(stderr,"usage: IPdestination path \n");
exit(1);
}
memset((char *)&dest, 0, sizeof(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(sd, filename, sizeof(filename), 0, (struct sockaddr*)&dest, sizeof(dest))<0){
perror("error sending name file"); }
.......
}
char* find_fileName(char* path){
char* token;
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.c
int main (int argc, char** argv){
int sd, sfamily, stype, sprotocol;
struct sockaddr_in receiver, their_addr;
socklen_t their_addr_len;
unsigned long encoded_file_size, file_size;
FILE* fout;
char filename[FILENAME];
char path[PATHLENGTH] = "/home/";
memset((char *)&receiver, 0, sizeof(receiver)); /*clean */
receiver.sin_family = AF_INET;
receiver.sin_port = htons(PORT);
receiver.sin_addr.s_addr = INADDR_ANY;
if ((sd = socket(AF_INET, SOCK_DGRAM, 0))<0)
perror("socket creation error");
if (bind(sd, (struct sockaddr*)& receiver, sizeof(receiver))){
perror("bind error");
exit(1);
}
memset(filename, 0,sizeof(filename));
if (recvfrom(sd,filename, sizeof(filename),0, NULL, NULL)<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);