Передача файлов сервер-клиент с использованием UDP в C
Я должен сделать передачу файлов сервер-клиент с помощью UDP . Я создал базовый сервер, который получает сообщение, отправленное клиентом . Это все. Теперь наступает главная часть :-
1. Сообщение, отправленное клиентом-имя файла .
2. Теперь сервер проверяет, существует ли этот файл или нет .
3. Если он существует, то отправляет файл клиенту, а также ведет подсчет количества запросов файла, сделанных клиентом .
Вот код сервера
#include<sys/socket.h> #include<arpa/inet.h> #include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<sys/types.h> #include<string.h> int main() { char buff[2000]; char file_buffer[2000]; int sd,connfd,len; struct sockaddr_in servaddr,cliaddr; sd = socket(AF_INET, SOCK_DGRAM, 0); if(sd==-1) { printf(" socket not created in server\n"); exit(0); } else { printf("socket created in server\n"); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(7802); if ( bind(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0 ) printf("Not binded\n"); else printf("Binded\n"); len=sizeof(cliaddr); recvfrom(sd,buff,1024,0, (struct sockaddr *)&cliaddr, &len); printf("%s\n",buff); /* */ FILE *fp; fp=fopen(buff,"r"); if(fp==NULL) { printf("file does not exist\n"); } fseek(fp,0,SEEK_END); size_t file_size=ftell(fp); fseek(fp,0,SEEK_SET); if(fread(file_buffer,file_size,1,fp)<=0) { printf("unable to copy file into buffer\n"); exit(1); } if(sendto(sd,file_buffer,strlen(file_buffer),0, (struct sockaddr *)&cliaddr, &len)<0) { printf("error in sending the file\n"); exit(1); } bzero(file_buffer,sizeof(file_buffer)); /* */ close(sd); return(0); }
Вот клиентский код
#include <stdio.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include<netinet/in.h> #include<sys/types.h> int main() { char buff[2000]; int sockfd,connfd,len; struct sockaddr_in servaddr,cliaddr; // create socket in client side sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd==-1) { printf(" socket not created in client\n"); exit(0); } else { printf("socket created in client\n"); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; // ANY address or use specific address servaddr.sin_port = htons(7802); // Port address printf("Type ur UDP client message\n"); scanf("%s",buff); // send msg to server sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)); char file_buffer[2000]; if (recvfrom(sockfd,file_buffer,2000,0, (struct sockaddr *)&servaddr, sizeof(struct sockaddr))<0) { printf("error in recieving the file\n"); exit(1); } char new_file[]="copied"; strcat(new_file,buff); FILE *fp; fp=fopen(new_file,"w+"); if(fwrite(file_buffer,1,sizeof(file_buffer),fp)<0) { printf("error writting file\n"); exit(1); } //close client side connection close(sockfd); return(0); }
Сервер считывает данные из файла и записывает в него и отправляет клиенту , на другом конце клиент получает данные и делает дубликат этого файла и записывает в него. Но при компиляции он выдает ошибку при записи файла :(
Jochen Arndt
Я думаю, что вы получили ошибку при выполнении файла, а не при компиляции.
Если это так, вызовите perror (), чтобы получить конкретное сообщение об ошибке.
Вы также должны передать file_size функции sendto (), а не strlen(file_buffer). strlen() будет работать только с текстовыми файлами и тогда, когда буфер был инициализирован нулевыми байтами.
Richard MacCutchan
Вы не должны использовать UDP для этого типа связи, если только вы не добавите свой собственный протокол для идентификации последовательности сообщений. Помните, что UDP не гарантирует порядок сообщений и даже то, будут ли они доставлены.
Member 10200096
да но я должен сделать это с помощью самого udp :)
Richard MacCutchan
Затем вам также нужно добавить гораздо больше кода, чтобы вы могли определить порядок каждого полученного сообщения, а также запросить повторную передачу, когда сообщение не будет доставлено. TCP сделает все это за вас.
Richard MacCutchan
В чем заключается ошибка и где она возникает?