C语言中的Socket中出现大文件传输错误

lh80um4z  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(365)

我正在编写一个从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);
}}
mu0hgdu0

mu0hgdu01#

您应该检查send()的结果
对于TCP套接字,send()将数据放入操作系统的内部队列中,这可能会填充您请求的部分大小。您应该处理这种不完整的发送并稍后重试。
编辑:由于OP在评论中披露了更多信息,似乎问题与网络无关,似乎存在选择文件发送的错误,他需要发布相关代码以进行进一步诊断。

41zrol4v

41zrol4v2#

服务器端:-我发送三个文件一个接一个调用函数3次.
客户端:-接收三个不同文件中的数据并保存。当我运行代码时,服务器显示文件发送成功三次。在客户端,它显示文件接收成功三次。但当我在客户端打开所有3个文件时,它们都有从服务器发送的第一个文件的数据。
如果这是一个准确的问题陈述,这是不清楚的,这只能意味着你发送了三次相同的文件,而不是发送三个不同的文件。你需要张贴代码调用这些函数,进一步的评论是可能的。

8fq7wneg

8fq7wneg3#

我无意中听说当零变成一个数字时,正如你在while()部分看到的,你在接收数据的地方,你正在检查它是否为零,但是recv()函数总是收集一些东西,只有它收集空值。如果您可以检查recv()是否已收到最后一批文件项,则关闭while()循环,但如果我推荐一种快速的方法,即在send()发送整个文件后关闭套接字,这样recv()函数就没有要接收的内容,并结束while()循环,然后重新连接到套接字。

相关问题