1

クライアントがファイルの名前をサーバーに送信するサーバークライアントアプリケーションを実装しようとしています。サーバーはファイルを探し、ファイルが存在する場合はそのファイルをクライアントに送り返します。ここに私が書いたコードがありますが、問題はサーバーがファイルの内容をクライアントに送り返さないことです。以前に同じ問題があったので、コードを書き直しました。

ここにコードがあります:-

サーバ側

#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[20];
    char content[200];
    int sd, connfd, len, bytes_read;

    struct sockaddr_in servaddr, cliaddr;

    sd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sd == -1) {
        puts("socket not created in server");
        return 1;
    } else {
        puts("socket created in server");
    }

    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) {
        puts("Not binded");
        return 1;
    } else {
        puts("Binded");
    }

    len = sizeof(cliaddr);

    recvfrom(sd, buff, 1024, 0, (struct sockaddr *)&cliaddr, &len);

    printf("%s\n", buff);

    FILE *fp = fopen(buff, "r");
    if (fp == NULL) {
        printf("File does not exist \n");
        return 1;
    }

    while (1) {
        bytes_read = read(fp, content, sizeof(content));
        if (bytes_read == 0)
            break;
        sendto(sd, content, sizeof(content), 0, (struct sockaddr*)&cliaddr, len);
        bzero(content, 200);
    }
    strcpy(content, "end");
    sendto(sd, content, sizeof(content), 0, (struct sockaddr*)&cliaddr, len);

    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() {
    int count = 0;
    char buff[20], output[20];
    char file_buffer[200];
    int sockfd, connfd, len;

    struct sockaddr_in servaddr, cliaddr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd == -1) {
        puts("socket not created in client");
        return 1;
    } else {
        puts("socket created in  client");
    }

    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

    puts("Type your UDP client message");
    scanf("%s", buff);
    puts("enter the name of new file to be saved");
    scanf("%s", output);

    // send msg to server
    sendto(sockfd, buff, strlen(buff) + 1, 0,
           (struct sockaddr *)&servaddr, sizeof(struct sockaddr));
    count++;
    printf("%d\n", count);

    FILE *fp = fopen(output, "a");
    if (fp == NULL) {
        puts("error in file handling");
        return 1;
    }
    recvfrom(sockfd, file_buffer, sizeof(file_buffer), 0, NULL, NULL);
    while (1) {
        if (strcmp(file_buffer, "end") == 0)
            break;
        printf("%s", file_buffer);
        write(fp, file_buffer, strlen(file_buffer));
        bzero(file_buffer, 200);
        recvfrom(sockfd, file_buffer, sizeof(file_buffer), 0, NULL, NULL);
    }

    puts("completed");
    return 0;
}
4

1 に答える 1

1

おそらく、サーバー側fread()ではなく関数を使用する必要があります。read()

関数fopen()read()は、さまざまなインターフェイスの一部です。

ファミリ read() -> open、close、read、write、ioctl (システム コール)

ファミリ fread() -> fopen、fclose、fread、fwrite、fcntl (標準ライブラリ)

によって与えられたファイル記述子は、予想fopen()とまったく同じではないと推測できます。read()

クライアント側も同様。を使用しfopen()てファイルを開きwrite()、書き込みます。をご利用くださいfwrite()

于 2013-09-01T14:43:25.760 に答える