在c中从服务器向客户端传输文件时获取垃圾值?
这是我的服务器和客户端的c代码。 /*TCP服务器*/在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
#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上得到了正确的数据。但最后,除了文件内容之外,还有一些垃圾值。