在c中从服务器向客户端传输文件时获取垃圾值?

在c中从服务器向客户端传输文件时获取垃圾值?,c,C,这是我的服务器和客户端的c代码。 /*TCP服务器*/ #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> FILE *fp; int main(i

这是我的服务器和客户端的c代码。 /*TCP服务器*/

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

    #include <string.h>
    #include <errno.h>

        #include <stdlib.h>

            FILE *fp;

        int main(int argc, char**argv){


            int listenfd,connfd,n;


            struct sockaddr_in servaddr,cliaddr;
            socklen_t clilen;

            char * banner = "1077"; // size of the file
            char buffer[1000];


            /* one socket is dedicated to listening */

            listenfd=socket(AF_INET,SOCK_STREAM,0);

            /* initialize a sockaddr_in struct with our own address information for
            binding the socket */

            servaddr.sin_family = AF_INET;
            servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
            servaddr.sin_port=htons(32000);

            /* binding */
            bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
            listen(listenfd,0); //listen( --,--);
            clilen=sizeof(cliaddr);

            /* accept the client with a different socket. */
            connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); // the uninitialized cliaddr variable is filled in with the
            n = recvfrom(connfd,buffer,1000,0,(struct sockaddr *)&cliaddr,&clilen);//information of the client by recvfrom function
                buffer[n] = 0;
            sendto(connfd,banner,strlen(banner),0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
            printf("Received:%s\n",buffer);


             char file_name[] ="severtext.txt";




                 fp = fopen(file_name,"r"); // read mode

                           if( fp == NULL )
                           {
                              perror("Error while opening the file.\n");
                              exit(EXIT_FAILURE);
                           }

                printf("The contents of %s file are :\n", file_name);
            char sendData[1000];
        /*open servertext.txt and coppy it to a char array */
                fread(sendData, 1000, 1, fp);

                printf("The contents of sending\n");

                         sendto(connfd,sendData,sizeof(sendData),0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));

        /*information of the client by recvfrom function */
                         n = recvfrom(connfd,buffer,1000,0,(struct sockaddr *)&cliaddr,&clilen);
                         buffer[n] = 0;
                         printf("Received:%s\n",buffer);









                 printf("End of connection \n");


            return 0;
        }
#包括
#包括
#包括
#包括
#包括
#包括
文件*fp;
int main(int argc,字符**argv){
int listenfd,connfd,n;
servaddr、cliaddr中的结构sockaddr\u;
socklen_t clilen;
char*banner=“1077”;//文件大小
字符缓冲区[1000];
/*一个插座专用于监听*/
listenfd=套接字(AF_INET,SOCK_STREAM,0);
/*使用我们自己的地址信息初始化结构中的sockaddr\u
绑定套接字*/
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servaddr.sinu port=htons(32000);
/*装订*/
绑定(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(listenfd,0);//listen(-,-);
clilen=sizeof(cliaddr);
/*使用不同的套接字接受客户端*/
connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);//未初始化的cliaddr变量用
n=recvfrom(connfd,buffer,1000,0,(struct sockaddr*)&cliaddr,&clilen);//通过recvfrom函数获取的客户端信息
缓冲区[n]=0;
sendto(connfd,banner,strlen(banner),0,(struct sockaddr*)和cliaddr,sizeof(cliaddr));
printf(“收到:%s\n”,缓冲区);
字符文件_name[]=“severtext.txt”;
fp=fopen(文件名,“r”);//读取模式
如果(fp==NULL)
{
perror(“打开文件时出错。\n”);
退出(退出失败);
}
printf(“文件%s的内容是:\n”,文件名);
char sendData[1000];
/*打开servertext.txt并将其压缩到字符数组中*/
fread(sendData,1000,1,fp);
printf(“发送的内容”);
sendto(connfd,sendData,sizeof(sendData),0,(struct sockaddr*)和cliaddr,sizeof(cliaddr));
/*通过recvfrom函数获取的客户端信息*/
n=recvfrom(connfd,buffer,1000,0,(struct sockaddr*)和cliaddr,&clilen);
缓冲区[n]=0;
printf(“收到:%s\n”,缓冲区);
printf(“连接结束\n”);
返回0;
}
…客户端代码 /*TCP客户端示例*/

 #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>



    int main(int argc, char**argv){



            int sockfd,n;
            FILE *fp;
            fp = fopen("file.txt", "w+");
        struct sockaddr_in servaddr;
        char banner[] = "request serverfile.txt";

           char revbuf1[1000];

        char buffer[4];

        if (argc != 2){
            printf("usage: ./%s <IP address>\n",argv[0]);
            return -1;
        }
        /* socket to connect */
        sockfd=socket(AF_INET,SOCK_STREAM,0);
        /* IP address information of the server to connect to */
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=inet_addr(argv[1]);
        servaddr.sin_port=htons(32000);
        connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

        sendto(sockfd,banner,strlen(banner),0, (struct sockaddr *)&servaddr,sizeof(servaddr));

        n=recvfrom(sockfd,buffer,10,0,NULL,NULL);
        buffer[n]=0;

        printf("Received: %s\n",buffer);


            printf("[Client] Receiveing file from Server and saving it as final.txt...");
            char * banner1="ok";


            printf("\ndata1 set\n"); 

            n=recvfrom(sockfd,revbuf1,1000,0,NULL,NULL);
        revbuf1[n]=0;
            sendto(sockfd,banner1,strlen(banner1),0, (struct sockaddr *)&servaddr,sizeof(servaddr));
        printf("Received: %s\n",revbuf1);
            //open file.txt and over write it with the recieved data in the client side.
            fwrite(revbuf1, 1000, 1, fp);
            fclose(fp);


             close (sockfd);
             printf("[Client] Connection lost.\n");
        return 0;


    }
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
int-sockfd,n;
文件*fp;
fp=fopen(“file.txt”,“w+”);
servaddr中的结构sockaddr_;
char banner[]=“request serverfile.txt”;
char revbuf1[1000];
字符缓冲区[4];
如果(argc!=2){
printf(“用法:./%s\n”,argv[0]);
返回-1;
}
/*连接插座*/
sockfd=套接字(AF_INET,SOCK_STREAM,0);
/*要连接到的服务器的IP地址信息*/
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
servaddr.sinu port=htons(32000);
connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
sendto(sockfd,banner,strlen(banner),0,(struct sockaddr*)和servaddr,sizeof(servaddr));
n=recvfrom(sockfd,buffer,10,0,NULL,NULL);
缓冲区[n]=0;
printf(“收到:%s\n”,缓冲区);
printf(“[Client]从服务器接收文件并将其保存为final.txt…”);
char*banner1=“确定”;
printf(“\n数据集\n”);
n=recvfrom(sockfd,revbuf1100,0,NULL,NULL);
revbuf1[n]=0;
sendto(sockfd,banner1,strlen(banner1),0,(struct sockaddr*)和servaddr,sizeof(servaddr));
printf(“收到:%s\n”,revbuf1);
//打开file.txt并在客户端用接收到的数据重写它。
fwrite(revbuf1,1000,1,fp);
fclose(fp);
关闭(sockfd);
printf(“[客户端]连接丢失。\n”);
返回0;
}

当我运行这两个程序时,我会在file.txt中得到包含servertext.txt内容的垃圾值,有人能帮我解决这个问题吗

因为您正在使用

fwrite(revbuf1, 1000, 1, fp);
数组中任何未使用的空间都将是垃圾。您应该这样做:

fwrite(revbuf1, 1, n, fp);

您是否在
printf
语句的
stdio
输出中看到客户端接收到的正确数据?代码格式提示:(1)在您喜爱的编辑器中编辑代码。(2) 将格式良好(缩进)的代码复制到剪贴板。(3) 粘贴到StackOverflow文本输入控件。(4) 在文本输入中标记代码。(5) 单击输入区域上方的
{}
符号。仅此而已,每次单击都有文档记录。这很容易。(句号)顺便说一句:通过这种方式,您可以发布可能见过编译器的代码。当您有不太有效的代码时,首先在所有系统调用中添加错误检查(即使您有在特定环境中测试时适用的代码,也可以添加错误检查,但这不是重点)
perror
是你的朋友。我在cmd上得到了正确的数据。但最后,除了文件内容之外,还有一些垃圾值。