Почему я получаю мусор / 00 символов в конце моего полученного файла, который был передан с помощью tcp client-server? - PullRequest
0 голосов
/ 17 ноября 2018
//Server Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include<unistd.h>

#define size 128
#define nofile "File Not Found"
#define E "EOF"

void sendFile(FILE*,int);

void main(int cnt,char *args[])
{
    //Declaration
    int Socket,Bind,Listen,Accept,Send,Recv,addrlen,sys;
    char Sendf[size],Recvf[size];
    struct sockaddr_in Server,Client;
    FILE *fp;

    //Socket
    if((Socket = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        perror("Socket Error: ");
        exit(0);
    }
    else
    {
        printf("Successful Socket\n");
    }
    //Bind
    Server.sin_family = AF_INET;
    Server.sin_port = htons(atoi(args[1]));
    Server.sin_addr.s_addr = inet_addr("127.0.0.1");

    if((Bind = bind(Socket,(const struct sockaddr*)&Server,sizeof(struct sockaddr))) == -1)
    {
        perror("Bind Error: ");
        exit(0);
    }
    else
    {
        printf("Successful Bind\n");
    }

    if((Listen = listen(Socket,5)) == -1)
    {
        perror("Listen Error: ");
        exit(0);
    }
    else
    {
        printf("Successful Listen\n");
    }

    addrlen = sizeof(Client);
    if((Accept = accept(Socket,(struct sockaddr*)&Client,&addrlen)) == -1)
    {
        perror("Accept Error: ");
        exit(0);
    }
    else
    {
        printf("Successful Accept\n");
    }

    if((sys = system("ls > abc.txt")) == -1)
    {
        perror("System Error: ");
        exit(0);
    }
    else
    {
        printf("Successful System Command\n");  
    }

    fp = fopen("abc.txt","r");

    sendFile(fp,Accept);

    fclose(fp);

    close(Socket);
}
void sendFile(FILE *fp,int Accept)
{
    char temp[size];
    int msg,msg_send;
    memset(temp,'\0',size*sizeof(char));
    if(fp == NULL)
    {
        strcpy(temp,nofile);
        printf("%s\n",temp);
        msg_send = send(Accept,temp,size,0);
        return;
    }
    else
    {
        while(!feof(fp))
        {
            msg = fread(temp,1,size,fp);
            msg_send = write(Accept,temp,size);
            memset(temp,'\0',size*sizeof(char));
        }
        msg_send = send(Accept,E,3,0);
        return; 
    }
}

Предыдущая программа - это серверный код, написанный для отправки указанного файла клиенту, который заполнен текущим списком имен файлов в каталоге / пути, в котором он выполняется.

//Client Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include<unistd.h>

#define size 128
#define nofile "File Not Found"
#define E "EOF"

void recvFile(FILE*,int);

void main(int cnt, char* args[])
{
    //Declaration
    int Socket,Send,Recv,addrlen,Connect;
    char Sendf[size],Recvf[size];
    struct sockaddr_in Server,Client;
    FILE *fp;

    //Socket
    if((Socket = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        perror("Socket Error: ");
        exit(0);
    }
    else
    {
        printf("Successful Socket\n");
    }
    //Bind
    Server.sin_family = AF_INET;
    Server.sin_port = htons(atoi(args[1]));
    Server.sin_addr.s_addr = inet_addr("127.0.0.1");

    //Connect
    if((Connect = connect(Socket,(const struct sockaddr*)&Server,sizeof(Server))) == -1)
    {
        perror("Connect Error: ");
        exit(0);
    }
    else
    {
        printf("Successful Connect\n");
    }

    fp = fopen("xyz.txt","w");

    recvFile(fp,Socket);

    fclose(fp);

    close(Socket);
}

void recvFile(FILE *fp,int Socket)
{
    char buff[size];
    memset(buff,'\0',size*sizeof(char));
    int msg_recv,msg;

    msg_recv = recv(Socket,buff,size,0);
    if(!strcmp(buff,nofile))
    {
        printf("%s\n",buff);
    }
    else
    {
        while(strcmp(buff,E))
        {
            msg = fwrite(buff,1,msg_recv,fp);
            buff[msg_recv] = '\0';
            printf("%s",buff);
            memset(buff,'\0',size*sizeof(char));
            msg_recv = read(Socket,buff,size);
        }
    }   
}

Этот код является клиентским кодом, чтобы получить файл на стороне клиента и сохранить его в файле xyz.txt. Именно здесь я сталкиваюсь с реальной проблемой, то есть получаю дополнительный символ мусора /00/00........... в конце файла xyz.txt.

Output of the file 
-------------------
abc.txt
a.out
client_file(1).c
FileClient.c
FileServer.c
fork_server.c
IO_multiplexing.c
server_file(1).c
tcpClient.c
tcpServer.c
udpClient.c
udpServer.c
xyz.txt
\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00

Output of printf in the terminal
--------------------------------
[enter image description here][1]

В терминале я получаю правильный вывод, но в файле я получаю символы мусора. Пожалуйста, помогите мне исправить это?

...