Member 10200096 Ответов: 2

Передача файлов сервер-клиент с использованием 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

В чем заключается ошибка и где она возникает?

2 Ответов

Рейтинг:
2

Member 14010597

может ли кто-нибудь сказать мне ,как скомпилировать этот код, где мы указываем каталог файлов???????????


Dave Kreskowiak

Во-первых, вы опубликовали это как решение вопроса, заданного пять лет назад.

Далее, вся предпосылка этого кода-чушь собачья, поскольку передача файлов никогда не должна использовать UDP. UDP не гарантирует доставку пакетов и даже не гарантирует порядок их доставки! Похоже ли это на хороший сетевой протокол для передачи файлов, который не допускает пропущенных данных или данных, вышедших из строя?

Рейтинг:
0

Member 10200096

Сделал это !

что - то было не так с ручкой файла
Вместо использования функции fopen ,использования open() ,Write() и Read() не делать работу улыбка | :)