0

LAN経由で送信する必要があるファイルpict.bmpがあります。ポートでリッスンを開始するサーバーがあります。クライアントがサーバーとの接続を確立した後、ファイルのファイル名を提供するサーバーを要求します。サーバー次に、ファイル名を使用してクライアントに送信します。ただし、問題は、サーバーが sendfile() システム コールを使用してファイルを正常に送信することですが、クライアントが実行されているディレクトリにファイルが表示されないことです。より良い方法はありますかつまり、同じ目的を満たす他のシステムコールです。ここに受信部分の送信をコピーして貼り付けています:

サーバー:

 while(1){

                    nsd = accept(sd,(struct sockaddr*)&clit,&clen);

                    if(nsd < 0){

                            eMsg("Accept error");

                    }

                    rc = recv(nsd, filename, sizeof(filename), 0);

                    if (rc < 0) {

                            eMsg("Receive error");

                    }

                    printf("Filename : %s\n",filename);

                    filename[strlen(filename) - 1] = '\0';

                    if (strcmp(filename, "quit") == 0) {

                            fprintf(stderr, "quit command received, shutting down server\n");

                            break;
                    }

                    fd = open("2bird.bmp", O_RDONLY);

                    printf("fd is %d\n",fd);

                    if (fd < 0) {

                            eMsg("File Open error");

                    }

                    offset = 0;

                    rc = sendfile (nsd, fd, NULL, 1);

                    if (rc < 0) {

                        eMsg("File Send error");

                        fprintf(stderr,"Sending failed");

                }

                if (rc != stat_buf.st_size) {

                        eMsg("File Transfer error");

                }

                close(fd);

                close(nsd);

クライアント :

bzero((char *) &serv_addr, sizeof(serv_addr));
     39
     40         serv_addr.sin_family = AF_INET;
     41
     42         bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr,server->h_length);
     43
     44         serv_addr.sin_port = htons(atoi(argv[2]));
     45
     46         if (connect(sd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
     47
     48                 eMsg("Connection error");
     49
     50         }
     51
     52         printf("Please enter the filename : ");
     53
     54         bzero(buffer,256);
     55
     56         fgets(buffer,255,stdin);
     57
     58         n = write(sd,buffer,strlen(buffer));
     59
     60         if (n < 0)
     61
     62         error("Writing To Socket error");
     63
     64
     65         close(sd);
     66
     67         return 0;
     68
     69 }
     70
     71 void eMsg(char *M){
     72
     73         perror(M);
4

2 に答える 2

1

ご覧のとおり、サーバー上で sendfile() を呼び出して、データを fd (bmp ファイルのファイル記述子) から nsd (ソケット) にコピーしました。ファイルの内容をソケット記述子にコピーしました。ただし、クライアントでこのコンテンツをフェッチするには、クライアント側でこのソケットからデータを受信する必要があります。

これを行っていないため、クライアント側でファイルを取得していません。

于 2012-07-06T09:21:18.320 に答える
0

例を挿入

    buffer[strcspn(buffer, "\n")] = '\0';
    int fd = open(buffer, O_CREAT|O_WRONLY, 0666);
    while (n = read(sd, buffer, 256), n > 0) write(fd, buffer, n);
    close(fd);

    close(sd);

(エラーチェックが追加されます)。確かに、より高いオーダーのバッファーサイズはより効率的です。

于 2014-03-26T14:21:52.587 に答える