2

UDP を使用してサーバーとクライアントのファイル転送を行う必要があります。クライアントから送信されたメッセージを受信する基本サーバーを作成しました。それで全部です。今、主要な部分が来ます:-

1. The message sent by client is the name of file .
2. Now the server checks whether there exists this file or not .
3. If there exists it sends the file to the client and it also keeps the count of the     number of requests of file made by the client .

私はこれが初めてで、さらに先に進む方法がわかりません。

サーバーコードはこちら

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

プログラムを編集し、新しいバッファ file_buffer を作成しました。サーバーはファイルからデータを読み取り、それに書き込み、クライアントに送信します。一方、クライアントはデータを受信し、このファイルの複製を作成して書き込みます。しかし、コンパイルすると、ファイルの書き込みでエラーが発生します:(

4

3 に答える 3

0

サーバーを FTP サーバーのように動作させますか?

クライアントからファイル名を受信したら、それが存在するかどうかを確認します。ファイルが C に存在するかどうかを確認する最良の方法は何ですか?を参照してください。(クロスプラットフォーム) . 次に、ファイルを開き、バッファごとに (一度に 200 バイトずつ) クライアントに送信します。同時に、クライアントはそれを受け取り、filenameという名前の新しいファイルに書き込みます。

于 2013-09-01T07:47:08.990 に答える