Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Socket编程c文件下载_C_Sockets - Fatal编程技术网

Socket编程c文件下载

Socket编程c文件下载,c,sockets,C,Sockets,我正在用c语言创建一个套接字程序。它将文件中的数据分成多个块,并通过套接字发送。目的地的数据以无序方式到达。我该如何处理这个问题。由于文件太大,我无法将所有数据保存到最后 我不熟悉这种情况下的标准方法,但afaik tcp是订购的。如果你坚持使用udp,你总是可以在每个数据块前加一个1字节(或更少)的数据块来指定顺序,然后在客户端使用它对它们进行排序。我不熟悉这种情况下的标准方法,但afaik tcp是被排序的。如果你坚持使用udp,你总是可以在每个数据块前加一个1字节(或更少)的数据块来指定顺

我正在用c语言创建一个套接字程序。它将文件中的数据分成多个块,并通过套接字发送。目的地的数据以无序方式到达。我该如何处理这个问题。由于文件太大,我无法将所有数据保存到最后

我不熟悉这种情况下的标准方法,但afaik tcp是订购的。如果你坚持使用udp,你总是可以在每个数据块前加一个1字节(或更少)的数据块来指定顺序,然后在客户端使用它对它们进行排序。

我不熟悉这种情况下的标准方法,但afaik tcp是被排序的。如果你坚持使用udp,你总是可以在每个数据块前加一个1字节(或更少)的数据块来指定顺序,然后在客户端使用它对它们进行排序。

提前创建一个稀疏文件,并在执行过程中填充它。您没有指定什么操作系统,但下面是一个示例程序,说明如何在linux中执行此操作

#define _BSD_SOURCE

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, const char *argv[])
{
    int fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0666);

    if (fd < 0)
    {
        perror("open");
        return(1);
    }

    int offset = lseek(fd, 200000, SEEK_CUR);

    ftruncate(fd, offset);

    close(fd);

    return 0;
}
\define\u BSD\u源
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]
{
int fd=open(argv[1],O_WRONLY | O|u CREAT | O|u TRUNC,0666);
如果(fd<0)
{
佩罗(“公开”);
申报表(1);
}
int offset=lseek(fd,200000,寻道电流);
ftruncate(fd,偏移量);
关闭(fd);
返回0;
}

假设您有某种方案,通过该方案您可以知道每个套接字上有哪些块(即偏移量)。用它来计算适当的偏移量并将其写入文件。

提前创建一个稀疏文件,并在执行过程中进行填充。您没有指定什么操作系统,但下面是一个示例程序,说明如何在linux中执行此操作

#define _BSD_SOURCE

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, const char *argv[])
{
    int fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0666);

    if (fd < 0)
    {
        perror("open");
        return(1);
    }

    int offset = lseek(fd, 200000, SEEK_CUR);

    ftruncate(fd, offset);

    close(fd);

    return 0;
}
\define\u BSD\u源
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]
{
int fd=open(argv[1],O_WRONLY | O|u CREAT | O|u TRUNC,0666);
如果(fd<0)
{
佩罗(“公开”);
申报表(1);
}
int offset=lseek(fd,200000,寻道电流);
ftruncate(fd,偏移量);
关闭(fd);
返回0;
}

假设您有某种方案,通过该方案您可以知道每个套接字上有哪些块(即偏移量)。使用它来计算适当的偏移量并将其写入文件。

假设您使用的是多个套接字,每个套接字对应一个块?请使用TCP而不是UDP。如果你已经在使用TCP,你有一个普通的错误。我正在使用TCP连接。对多个套接字可从不同位置下载文件。因此,它们肯定会出问题。无法弄清楚如何将数据保存在磁盘上,并最终按顺序组合所有数据块。请创建一个与最终文件大小相同的文件。发送每个块的偏移量。找到那一点,写出这段话。在你得到所有的块之后,你的文件就完成了。你是说创建一个空文件吗??是的,我们如何在c中实现这一点。假设您正在使用多个套接字,每个套接字对应一个块?请使用TCP而不是UDP。如果你已经在使用TCP,你有一个普通的错误。我正在使用TCP连接。对多个套接字可从不同位置下载文件。因此,它们肯定会出问题。无法弄清楚如何将数据保存在磁盘上,并最终按顺序组合所有数据块。请创建一个与最终文件大小相同的文件。发送每个块的偏移量。找到那一点,写出这段话。在你得到所有的块之后,你的文件就完成了。你是说创建一个空文件吗??是的,我们如何在c中实现这一点。我使用TCP连接。对多个套接字可从不同位置下载文件。因此,它们肯定会出问题。不知道如何将数据保存在磁盘上,并最终按顺序组合所有数据块。例如,从多个服务器下载单个文件?将块的偏移量编码为第一个字或字节。然后您就知道块在文件中的确切位置了。如果你是客户,不能接触服务器,那么你可能就不走运了。如果服务器没有告诉你你得到了什么,那么你就不能订购你的数据。我使用的是TCP连接。对多个套接字可从不同位置下载文件。因此,它们肯定会出问题。不知道如何将数据保存在磁盘上,并最终按顺序组合所有数据块。例如,从多个服务器下载单个文件?将块的偏移量编码为第一个字或字节。然后您就知道块在文件中的确切位置了。如果你是客户,不能接触服务器,那么你可能就不走运了。如果服务器没有告诉你你得到了什么,那么你就不能订购你的数据。