我正在编写一个从server.c到client.c程序的文件传输代码。但是在运行时它不能正常工作。我正在发送一个512字节的文件。源文件i 784 KB有将近88000个名字在里面。
这个程序在www.example.com上可以正常工作127.0.0.1但当我在局域网/无线网络上连接两台电脑时,它就不能正常工作了。
我不包括完整的文件,只包括我将要传送/接收文件的函数。
帮我找出代码中的错误。
如果你测试它,然后做两台电脑之间。
如果你们有一个更好的文件发送和接收代码,请张贴它,看到它,我需要的控制功能后,传输完成。我真的很感谢你的帮助。
我将Linux用于以下目的&愚者用于编译
仅服务器. c的功能
void filesender(char fs_name[],int ncfd)
{
char sdbuf[LENGTH];
FILE *fs=fopen(fs_name,"r");
if(fs==NULL)
{
perror("\n[Server] File is not found on Server Directory");
exit(1);
}
bzero(sdbuf, LENGTH);
int fs_block_sz;
while((fs_block_sz = fread(sdbuf, sizeof(char), LENGTH, fs))>0)
{
if(send(ncfd, sdbuf, fs_block_sz, 0) < 0)
{
puts("\n[Server] Error: Sending File Failed");
exit(1);
}
bzero(sdbuf, LENGTH);
}
puts("\n[Server] File Sended Successfull");
}
Client.c
void filereciever(int id,int ncfd)
{
char revbuf[LENGTH]; //Buffer variable to hold recieved data
char *fr_name;
char fid=id;
asprintf(&fr_name,"result%c.txt",fid);
FILE *fr = fopen(fr_name, "a");
if(fr == NULL)
{
printf("[Server] File %s Cannot be opened.\n", fr_name);
}
else
{
bzero(revbuf, LENGTH);
int fr_block_sz = 0;
while((fr_block_sz = recv(ncfd, revbuf, LENGTH, 0)) > 0)
{
int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);
if(write_sz < fr_block_sz)
{
puts("\n[Server] File write failed");
}
bzero(revbuf, LENGTH);
if (fr_block_sz == 0 || fr_block_sz != 512)
{
break;
}
}
if(fr_block_sz < 0)
{
if (errno == EAGAIN)
{
puts("\n[Server] Error: recv() timed out");
}
else
{
printf("\n[Server] Error: recv() failed due to errno = %d", errno);
}
}
printf("[Server] File successfully received from server!\n");
fclose(fr);
}}
3条答案
按热度按时间mu0hgdu01#
您应该检查
send()
的结果对于TCP套接字,
send()
将数据放入操作系统的内部队列中,这可能会填充您请求的部分大小。您应该处理这种不完整的发送并稍后重试。编辑:由于OP在评论中披露了更多信息,似乎问题与网络无关,似乎存在选择文件发送的错误,他需要发布相关代码以进行进一步诊断。
41zrol4v2#
服务器端:-我发送三个文件一个接一个调用函数3次.
客户端:-接收三个不同文件中的数据并保存。当我运行代码时,服务器显示文件发送成功三次。在客户端,它显示文件接收成功三次。但当我在客户端打开所有3个文件时,它们都有从服务器发送的第一个文件的数据。
如果这是一个准确的问题陈述,这是不清楚的,这只能意味着你发送了三次相同的文件,而不是发送三个不同的文件。你需要张贴代码调用这些函数,进一步的评论是可能的。
8fq7wneg3#
我无意中听说当零变成一个数字时,正如你在
while()
部分看到的,你在接收数据的地方,你正在检查它是否为零,但是recv()
函数总是收集一些东西,只有它收集空值。如果您可以检查recv()
是否已收到最后一批文件项,则关闭while()
循环,但如果我推荐一种快速的方法,即在send()
发送整个文件后关闭套接字,这样recv()
函数就没有要接收的内容,并结束while()
循环,然后重新连接到套接字。