C服务器客户端FTP。有时它';这是一个大文件,我不知道;I don’我寄来的东西我都看不懂

C服务器客户端FTP。有时它';这是一个大文件,我不知道;I don’我寄来的东西我都看不懂,c,sockets,ftp,C,Sockets,Ftp,我正在做一个FTP服务器和客户端。 我用一个send函数发送(数据大小(最大64000)+sizeof(struct header))的包,该函数包含一个struct header,它提供我需要用recv函数读取的数据大小和文件数据。 我不明白为什么在发送一个大文件时,当我读取包时,有时我不读取其中一个头,所以我将文件的数据放在头结构中,而malloc崩溃显然是因为头结构为false,我尝试分配太多 char *ftp_get_package(int sock, t_header *hea

我正在做一个FTP服务器和客户端。 我用一个send函数发送(数据大小(最大64000)+sizeof(struct header))的包,该函数包含一个struct header,它提供我需要用recv函数读取的数据大小和文件数据。 我不明白为什么在发送一个大文件时,当我读取包时,有时我不读取其中一个头,所以我将文件的数据放在头结构中,而malloc崩溃显然是因为头结构为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);
}
char*ftp\u get\u包(int-sock,t\u头*头)
{
字符*浅黄色;
ssize_t ret;
ret=0;
而((ret+=recv(sock,header,sizeof(t_header),0))>=0
&&(尺寸(t)ret<尺寸(t)头)
;
ft_putstr(“|”);//调试
ft_putstr((char*)头);//调试
ft_putendl(“|”);//调试
ft_putnbr(头->字节);//调试
ft_putendl(“您的
recv()
循环请求的数据超过了缓冲区中的空间,因为您没有从限制中减去已读取的字节。您需要执行以下操作:

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

您不显示
ft\u putstr()<代码> >代码>结构头(<代码> >定义,但函数看起来期望一个空终止的字符串参数,而Health不是字符串。< /P>C和C++是不同的语言。除非你是在比较C语言或C++语言,否则你不需要标记C++,除非你比较两种语言,或者实际上是在编程。对于同一个项目(问题与C和C++之间的交互有关)然后不要同时添加这两个标记。只使用您实际使用的编程语言的语言标记。请花一些时间来添加。另外,请阅读Eric Lippert.MSDN:“如果没有发生错误,send将返回发送的字节总数,这可能小于len参数中请求发送的字节数。”您只检查是否返回错误,n“短发送”的ot。应该在send()周围有一个循环,类似于使用round recv()的循环。一般情况下,不要强制转换
malloc
&friends或
void*
的结果。代码包含许多缺陷和错误。例如,您不检查错误。这使得跟踪错误成为问题,即使使用调试器也是如此。以及“如果需要更多详细信息,请向我提问。”“这不是本网站的工作方式。请阅读。您不需要cast
(size\u t)ret
,因为这是变量的类型。
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
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);