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