Отправка файла с сервера на клиент повреждена в c - PullRequest
0 голосов
/ 01 мая 2019

У меня есть эта модель клиент-сервер UDP, когда сервер отправляет файл клиенту.все работает отлично, за исключением того, что файл, созданный на стороне клиента, содержит ненужные данные.Я не знаю, почему это происходит.

server.c

#include <stdio.h>
#include <sys/socket.h> //for sock()
#include <string.h>//for using memset
#include <arpa/inet.h>// for inet_addr()
#include <unistd.h>//for using write() function
int main(){


    int sock=0;
    char data_send[1024],file_name[1024],symbol;
    struct sockaddr_in ServerIp;
    struct sockaddr_storage ClientIp;

    //AF_INET : The address family value for IPv4 addresses
    // SOCK_DGRAM argument confirms that we are using UDP as a protocol in this communication
    sock = socket(AF_INET, SOCK_DGRAM, 0);

    socklen_t addr_len;
    addr_len = sizeof(ClientIp);
    //addr_len to store the length of client address


    //https://stackoverflow.com/questions/13327155/memset-definition-and-use
     memset(&ServerIp,'0',sizeof(ServerIp) );


     ServerIp.sin_family = AF_INET;
     ServerIp.sin_port = htons(1234);
     ServerIp.sin_addr . s_addr = inet_addr("127.0.0.1");


     if(   bind( sock,(struct sockaddr* )&ServerIp, sizeof(ServerIp)) == -1 )
        printf("\n Socket binding failed \n");
     else
        printf("\n Server Started !!\n ");


    // https://linux.die.net/man/2/recvfrom
    recvfrom( sock,file_name, sizeof(file_name) ,0, (struct sockaddr *)&ClientIp,&addr_len );
    printf("\n filename received from client: %s \n",file_name);

    FILE *fp = fopen("test.txt", "r");
    if(fp == NULL){
        printf("cannot open file");

    }
    else{
        while((symbol = getc(fp)) != EOF) {
            strcat(data_send,&symbol);
        }
    }

    fclose(fp);

    if( (sendto(sock,data_send, sizeof(data_send) ,0, (struct sockaddr *)&ClientIp, addr_len)) ==-1 )
        printf("sending failed\n");

    //sendto(sock,data_send,sizeof(data_send),0, (struct sockaddr *)&ClientIp, sizeof(ClientIp) );
    printf(" Message send is : %s \n",data_send);

    return 0;

}

client.c

#include <stdio.h>
#include <sys/socket.h> //for sock()
#include <string.h>//for using memset
#include <arpa/inet.h>// for inet_addr()
#include <unistd.h>//for using write() function
#include <netinet/in.h>
int main(){


    int sock=0;
    char data_send[1024],data_received[1024];

    struct sockaddr_in ServerIp;


    if( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
        printf("\n Socket creation failed \n");

    memset(&ServerIp,'0',sizeof(ServerIp) );


    ServerIp.sin_family = AF_INET;
    ServerIp.sin_port = htons(1234);
    ServerIp.sin_addr . s_addr = inet_addr("127.0.0.1");

    printf(" Enter the file name to be send to server: \n>> ");
    fgets(data_send, sizeof(data_send), stdin ); 

    sendto(sock,data_send,sizeof(data_send),0, (struct sockaddr *)&ServerIp, sizeof(ServerIp) );
    printf(" Message send to server is : %s \n",data_send);


    recvfrom(sock,data_received,sizeof(data_received) ,0,NULL,NULL );

    FILE *fp = fopen("response.txt", "w");
    if (fp == NULL){
        printf("Error opening file!\n");
    }
    fprintf(fp,"%s",data_received);


    printf("\n Data received from server: %s \n",data_received);
    return 0;

}

если файл «test.txt» на сервере содержит что-то вроде этого

1. The server starts and waits for filename.
2. The client sends a filename.
3. The server receives filename.
   If file is present, 

Тогда выходной файл «response.txt», созданный клиентом, будет иметь <0x10> между всеми символами выводапроизводится.но если я напечатаю это как вывод, то все будет хорошо.

Я не могу вставить это здесь, потому что, если я вставлю это здесь, то это будет выглядеть хорошо

...