gpt4 book ai didi

C 服务器客户端 FTP。有时,当文件很大时,我不会读完发送的所有内容

转载 作者:行者123 更新时间:2023-11-30 19:33:36 26 4
gpt4 key购买 nike

我正在做一个 FTP 服务器和客户端。我使用发送函数发送(数据大小(最大 64000)+ sizeof(结构头))的包,该函数包含一个结构头,该结构头给出了我需要使用 recv 函数读取的数据的大小和文件数据。我不明白为什么,当发送一个大文件时,当我读取包时,有时我不读取其中一个 header ,所以我将文件的数据放在我的 header 结构中,并且 malloc 显然会崩溃,因为 header 结构是false,我尝试分配太多。

char    *ftp_get_package(int sock, t_header *header)
{
char *buff;
ssize_t ret;

ret = 0;
while ((ret += recv(sock, header, sizeof(t_header), 0)) >= 0
&& (size_t)ret < sizeof(t_header))
;
ft_putstr("|"); // DEBUG
ft_putstr((char*)header); // DEBUG
ft_putendl("|"); // DEBUG
ft_putnbr(header->nb_bytes); // DEBUG
ft_putendl(" <--- get"); // DEBUG
if (ret != -1)
{
if (!(buff = (char*)malloc(header->nb_bytes + 1)))
ftp_error(NULL, "ERROR: malloc failure\n", 0);
ret = 0;
while ((ret += recv(sock, buff + ret, header->nb_bytes, 0)) >= 0
&& (size_t)ret < header->nb_bytes)
;
if (ret > 0)
{
buff[ret] = '\0';
return (buff);
}
}
if (ret == -1)
ftp_error(NULL, "ERROR: recv failure\n", 0);
return (NULL);
}

void ftp_send_package(char *str, int sock, char flag, long size)
{
t_header header;
ssize_t ret;
char *package;
int size_header;

if (size == -1)
header.nb_bytes = ft_strlen(str);
else
header.nb_bytes = size;
ft_putnbr(header.nb_bytes); // DEBUG
ft_putendl(" <--- send"); // DEBUG
header.flag = flag;
size_header = sizeof(t_header);
if (!(package = malloc(size_header + header.nb_bytes)))
ftp_error(NULL, "ERROR: malloc failure !\n", sock);
ft_memcpy(package, &header, size_header);
ft_memcpy(package + size_header, str, header.nb_bytes);
if ((ret = send(sock, package, size_header + header.nb_bytes, 0)) == -1)
ftp_error(NULL, "ERROR: send failure\n", sock);
free(package);
}

kiki 是我用来调试的文件。里面有 'a'*64000 然后 'b'*64000 然后 'c'*64000 ... 't'*64000kiki 大小为 1 280 000

服务器调试

11 <--- get // get -> "mkfile kiki" to create file kiki
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
||
64000 <--- get
|mmmmmmmmmmmmmmmm�A| // putstr of header
7885078839350357357 <--- get
serveur(30378,0x7fff7b25c000) malloc: ***
mach_vm_map(size=7885078839350358016) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
ERROR: malloc failure

客户端调试

ftp -> put kiki
11 <--- send // send -> "mkfile kiki"
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
64000 <--- send
1 <--- send
0 <--- send
0 <--- send

如果您需要更多详细信息,请向我提问

谢谢你帮助我。

最佳答案

您的 recv() 循环请求的数据多于缓冲区中的空间,因为您没有从限制中减去已读取的字节。你需要做的是:

while ((ret += recv(sock, header, sizeof(t_header) - ret, 0)) >= 0
&& ret < sizeof(t_header))
;

和:

    while ((ret += recv(sock, buff + ret, header->nb_bytes - ret, 0)) >= 0
&& ret < header->nb_bytes)
;

此外,这看起来可能是一个问题:

ft_putstr((char*)header);

您没有显示 ft_putstr()struct header 定义,但该函数似乎需要一个以 null 结尾的字符串参数,并且 header 不是字符串。

关于C 服务器客户端 FTP。有时,当文件很大时,我不会读完发送的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com