当前位置: 技术问答>linux和unix
为什么Linux网络传输文件的程序,在本机接收和发数据都没错,发到别的电脑上就会接收多了几百个字节呢???
来源: 互联网 发布时间:2017-05-26
本文导语: 我编写了两个Linux网络传输文件的程序,采用TCP协议,一个客户端,一个服务器,客户端向服务器发数据,如果在本机互发就不会出错,但是在本机运行客户端,另一台电脑运行服务端,然后客户端发数据过去,服务...
我编写了两个Linux网络传输文件的程序,采用TCP协议,一个客户端,一个服务器,客户端向服务器发数据,如果在本机互发就不会出错,但是在本机运行客户端,另一台电脑运行服务端,然后客户端发数据过去,服务器接收了,但是多了几百个字节,文件也打不开,这是什么原因导致的呢???
我是新手,求大神帮忙!!部分代码:
客户端:
......
/*以二进制方式打开文件,并且获取文件名跟文件长度*/
FILE *filefd;
filefd =fopen(argv[2],"rb");
if (filefd == NULL)
{printf ("Open file failed.n");
exit(1);
}
char *FILE_LEN;
FILE_LEN = argv[2];
stat (FILE_LEN,&buf); //计算文件长度
char file_name[2048];
char file_len[2048];
memset(file_name, 0, sizeof(file_name)); //清空存放文件名的数组内存单元
sprintf(file_name, "%s", argv[2]); //把文件名放到file_name数组里
memset(file_len, 0, sizeof(file_len)); //清空存放长度的数组内存单元
sprintf(file_len, "%d",buf.st_size); //把文件长度放到file_len数组里
gettimeofday(&tv1,&tz1); //获取当前时间
/*先发送文件名跟文件长度给服务器端*/
if ((sendbytes = send(sockfd, file_name, sizeof(file_name), 0)) == -1)
{
perror("send");
exit(1);
}
if ((sendbytes = send(sockfd, file_len, sizeof(file_len), 0)) == -1)
{
perror("send");
exit(1);
}
/*再发送文件内容给服务器端*/
int sumbytes;
sumbytes =0;
while ((read_len = fread(buff, 1, sizeof(buff),filefd)) > 0)
{
if ((sendbytes = send(sockfd, buff, read_len, 0)) == -1)
{
perror("send");
exit(1);
}
sumbytes +=sendbytes;
}
服务端:
.......
/*调用recv函数接收文件名,然后创建文件*/
gettimeofday(&tv1,&tz1); //获取当前时间
memset(buf , 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
sscanf(buf, "%s", file_name);
FILE *filefd;
filefd =fopen(file_name,"w");
printf("The received file is :%sn",file_name);
printf("buf1 is:%sn",buf);
/*接受文件长度*/
memset(buf , 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
sscanf(buf, "%d",&file_len);
printf("The length of the received file is :%d 字节n",file_len);
printf("buf2 is:%sn",buf);
/*再接收文件内容*/
memset(buf , 0, sizeof(buf));
Byte_sum = 0;
while(Byte_sum file_len)
{
bytes =Byte_sum -file_len;
recvbytes -=bytes;
}
fwrite(buf,1,recvbytes,filefd);
}
我是新手,求大神帮忙!!部分代码:
客户端:
......
/*以二进制方式打开文件,并且获取文件名跟文件长度*/
FILE *filefd;
filefd =fopen(argv[2],"rb");
if (filefd == NULL)
{printf ("Open file failed.n");
exit(1);
}
char *FILE_LEN;
FILE_LEN = argv[2];
stat (FILE_LEN,&buf); //计算文件长度
char file_name[2048];
char file_len[2048];
memset(file_name, 0, sizeof(file_name)); //清空存放文件名的数组内存单元
sprintf(file_name, "%s", argv[2]); //把文件名放到file_name数组里
memset(file_len, 0, sizeof(file_len)); //清空存放长度的数组内存单元
sprintf(file_len, "%d",buf.st_size); //把文件长度放到file_len数组里
gettimeofday(&tv1,&tz1); //获取当前时间
/*先发送文件名跟文件长度给服务器端*/
if ((sendbytes = send(sockfd, file_name, sizeof(file_name), 0)) == -1)
{
perror("send");
exit(1);
}
if ((sendbytes = send(sockfd, file_len, sizeof(file_len), 0)) == -1)
{
perror("send");
exit(1);
}
/*再发送文件内容给服务器端*/
int sumbytes;
sumbytes =0;
while ((read_len = fread(buff, 1, sizeof(buff),filefd)) > 0)
{
if ((sendbytes = send(sockfd, buff, read_len, 0)) == -1)
{
perror("send");
exit(1);
}
sumbytes +=sendbytes;
}
服务端:
.......
/*调用recv函数接收文件名,然后创建文件*/
gettimeofday(&tv1,&tz1); //获取当前时间
memset(buf , 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
sscanf(buf, "%s", file_name);
FILE *filefd;
filefd =fopen(file_name,"w");
printf("The received file is :%sn",file_name);
printf("buf1 is:%sn",buf);
/*接受文件长度*/
memset(buf , 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
sscanf(buf, "%d",&file_len);
printf("The length of the received file is :%d 字节n",file_len);
printf("buf2 is:%sn",buf);
/*再接收文件内容*/
memset(buf , 0, sizeof(buf));
Byte_sum = 0;
while(Byte_sum file_len)
{
bytes =Byte_sum -file_len;
recvbytes -=bytes;
}
fwrite(buf,1,recvbytes,filefd);
}
|
看描述比较诡异,自己调试一下,首先确定是发送端的问题还是接收端的问题,可以先调客户端,多出来的是不是客户端发送的