谁有C或C++(不用MFC)的FTP客户端的例子?

kkk16 2002-02-27 02:07:40
我需要一个C或C++(不用MFC)的FTP客户端的例子。
比如我要下载 ftp.abc.com上的目录 mydir 下的所有文件,用户名是 aaa,密码是 bbb。该怎么写?
分不够再加。
...全文
76 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello008 2002-03-12
  • 打赏
  • 举报
回复
int ftp_cmd(int sd, char *cmd, int success_code)
{
int code;

if(tcp_send(sd, cmd, strlen(cmd), 5) !=(int)strlen(cmd))
{
log_msg("ftp_cmd: tcp_send failed");
return -1;
}
if((code =get_reply(sd)) !=success_code)
{
log_msg(cmd);
log_msg(g_reply);
return -2;
}
return 0;
}

int ftp_login(char *hostname, char *user_name, char *passwd)
{
int sd, ret;
char cmds[100];

if((sd =tcp_connect(hostname, 21, 10)) <0)
return -1;
if((ret =get_reply(sd)) !=220)
{
closesocket(sd);
return -1;
}
sprintf(cmds, "USER %s\r\n", user_name);
if(ftp_cmd(sd, cmds, 331) <0)
{
closesocket(sd);
return -1;
}
sprintf(cmds, "PASS %s\r\n", passwd);
if(ftp_cmd(sd, cmds, 230) <0)
{
closesocket(sd);
return -1;
}
sd_login =sd;

return sd;
}

int ftp_chdir(int sd, char *path)
{
char cmds[100];

sprintf(cmds, "CWD %s\r\n", path);
if(ftp_cmd(sd, cmds, 250) <0)
return -1;
return 0;
}

int ftp_get_size(int sd, char *file_remote)
{
int size =0;
char cmds[100];

sprintf(cmds, "SIZE %s\r\n", file_remote);
if(ftp_cmd(sd, cmds, 213) <0)
return 0;
if(sscanf(g_reply, "%*d %d", &size) !=1)
return 0;

return size;
}

int ftp_get_time(int sd, char *file_remote, char *pstime)
{
char cmds[100];

sprintf(cmds, "MDTM %s\r\n", file_remote);
if(ftp_cmd(sd, cmds, 213) <0)
return -1;
strncpy(pstime, &g_reply[4], 14);

return 0;
}

int ftp_get_file(int sd, char *file_remote, char *file_local, int file_len, int max_wait_time)
{
char temp[200], cmds[300];
int len, len_recved =0, ret =0, code;
char buf[4096];
FILE *fp =NULL;
int sd_data =-1;

temp[0] =0;
if(ftp_cmd(sd, "TYPE I\r\n", 200) <0)
{
sprintf(temp, "ftp_get_file:TYPE I failed! sd=%d, file_remote:%s", sd, file_remote);
ret =-2;
goto f_exit;
}

if(file_len <=0)
if((file_len =ftp_get_size(sd, file_remote)) <=0)
{
sprintf(temp, "ftp_get_file:ftp_get_size failed! sd =%d, file_remote=%s, ret_len=%d", sd, file_remote, file_len);
ret =-3;
goto f_exit;
}

if((sd_data =initconn(sd)) <0)
{
sprintf(temp, "ftp_get_file:initconn failed! sd =%d, file_remote:%s", sd, file_remote);
ret =-4;
goto f_exit;
}
sprintf(cmds, "RETR %s\r\n", file_remote);
if(ftp_cmd(sd, cmds, 150) <0)
{
sprintf(temp, "ftp_get_file:ftp_cmd failed! cmd:%s", cmds);
ret =-5;
goto f_exit;
}

if((sd_accept =tcp_accept(sd_data, 20)) <0)
{
sprintf(temp, "ftp_get_file:ftp_accept failed! sd=%d, sd_data=%d, file_remote=%s", sd, sd_data, file_remote);
ret =-6;
goto f_exit;
}

len_recved =0;
if((fp =fopen(file_local, "wb")) ==NULL)
{
sprintf(temp, "ftp_get_file:open file for write failed! local_file:%s", file_local);
ret =-1;
goto f_exit;
}

while(len_recved < file_len)
{
if(file_len-len_recved <sizeof(buf)) len =file_len-len_recved;
else len =sizeof(buf);
if(tcp_recv(sd_accept, buf, len, max_wait_time) !=len)
{
sprintf(temp, "ftp_get_file:tcp_recv failed! len_recved:%d, file_len:%d, file_remote:%s", len_recved, file_len, file_remote);
ret =-7;
get_reply(sd);
goto f_exit;
}
if(fwrite(buf, len, 1, fp) !=1)
{
sprintf(temp, "ftp_get_file: fwrite failed! len_recved:%d, file_local:%s", len_recved, file_local);
get_reply(sd);
ret =-8;
goto f_exit;
}
len_recved +=len;
}
tcp_close(sd_accept); sd_accept =-1;
ret =len_recved;
if((code =get_reply(sd)) !=226)
{
sprintf(temp, "ftp_get_file:get_reply failed after recv success! ret_code:%d, reply string:%s", code, g_reply);
goto f_exit;
}

f_exit:
if(sd_accept >=0) tcp_close(sd_accept);
if(sd_data >=0) tcp_close(sd_data);
sd_accept =-1;
sd_data =-1;
if(fp) fclose(fp);
if(ret <0)
{
sprintf(temp, "ftp_get_file failed. ret=%d", ret);
log_msg(temp);
remove(file_local);
}

return ret;
}

int ftp_put_file(int sd, char *file_local, int pos, char *file_remote, int max_wait_time)
{
char cmds[300];
int len, file_len =0, len_sent =0, ret =0, code;
char buf[4096];
FILE *fp =NULL;
int sd_data;

if((fp =fopen(file_local, "r")) ==NULL)
{
ret =-1;
goto f_exit;
}
fseek(fp, 0, SEEK_END);
file_len =ftell(fp)-pos;
if(file_len <0) return -1;
if(file_len ==0) return 0;
fseek(fp, pos, SEEK_SET);

if(ftp_cmd(sd, "TYPE I\r\n", 200) <0)
{
ret =-1;
goto f_exit;
}

if((sd_data =initconn(sd)) <0)
{
ret =-1;
goto f_exit;
}
sprintf(cmds, "STOR %s\r\n", file_remote);
if(ftp_cmd(sd, cmds, 150) <0)
{
ret =-1;
goto f_exit;
}

if((sd_accept =tcp_accept(sd_data, 20)) <0)
{
ret =-1;
goto f_exit;
}

len_sent =0;
while(len_sent < file_len)
{
if(file_len-len_sent <sizeof(buf)) len =file_len-len_sent;
else len =sizeof(buf);
if(fread(buf, len, 1, fp) !=1)
{
get_reply(sd);
ret =-1;
goto f_exit;
}
if(tcp_send(sd_accept, buf, len, max_wait_time) !=len)
{
ret =-1;
get_reply(sd);
goto f_exit;
}
len_sent +=len;
}
closesocket(sd_accept); sd_accept =-1;
if((code =get_reply(sd)) !=226)
{
goto f_exit;
}
ret =len_sent;

f_exit:
if(sd_accept >=0) closesocket(sd_accept);
if(sd_data >=0) closesocket(sd_data);
sd_accept =-1;
sd_data =-1;
if(fp) fclose(fp);
if(buf) free(buf);

return ret;
}

int initconn(int sd)
{
char *p1, *p2;
struct sockaddr_in addr1, addr2;
char temp[256];
int len;
int code, sd_data=-1;

if((sd_data =tcp_bind(NULL, 0)) <0)
return -1;
len =sizeof(addr1);
if(getsockname(sd_login, (struct sockaddr *)&addr1, &len) <0)
return -1;
if(getsockname(sd_data, (struct sockaddr *)&addr2, &len) <0)
return -1;
p1 =(char *)&addr1.sin_addr;
p2 =(char *)&addr2.sin_port;
sprintf(temp, "PORT %d,%d,%d,%d,%d,%d\r\n", ((int)p1[0]) &0xff, ((int)p1[1]) &0xff, (int)p1[2] &0xff, (int)p1[3]&0xff, (int)p2[0]&0xff, (int)p2[1]&0xff);
if(tcp_send(sd, temp, strlen(temp), 10) !=(int)strlen(temp))
{
closesocket(sd_data);
return -1;
}
if((code =get_reply(sd)) !=200)
{
closesocket(sd_data);
return -1;
}
return sd_data;
}

int get_reply(int sd)
{
int i, code =0;

again:
i =0;
memset(g_reply, 0, sizeof(g_reply));
while(1)
{
if(tcp_recv(sd, &g_reply[i], 1, 10) <=0)
break;
if(g_reply[i] =='\r') g_reply[i] =' ';
if(g_reply[i] =='\n')
{
g_reply[i] =' ';
if(sscanf(g_reply, "%d", &code) !=1)
{
return -1;
}
else break;
}
i++;
}
if(g_reply[3] =='-')
{
i =0;
goto again;
}
g_code =code;

return code;
}

void ftp_quit(int sd)
{
ftp_cmd(sd, "QUIT\r\n", 221);
closesocket(sd);
}
Anoa 2002-03-04
  • 打赏
  • 举报
回复
用MS internet api 中FTP api写蛮方便的
hello008 2002-03-04
  • 打赏
  • 举报
回复
www.programsalon.com,有无数个ftp client和server的源码
Kevin_qing 2002-03-04
  • 打赏
  • 举报
回复
喔哈~
有问题再联系我好了,呵呵
kkk16 2002-02-28
  • 打赏
  • 举报
回复
其实,网上的都是用MFC写的,很容易找到。
但真正不用MFC写的C程序我找了几天都没找到。
我要的功能也不难,就是问题中说的那样。
如果谁能给我一个,我将会给他加分的。
谁能帮我?
neccui 2002-02-28
  • 打赏
  • 举报
回复
网上去找吧,程序不难,但是要写完善了则很不容易。
kkk16 2002-02-28
  • 打赏
  • 举报
回复
没谁写过吗?
kkk16 2002-02-27
  • 打赏
  • 举报
回复
怎么写啊,我不太懂FTP协议。
谁能给我一个例子吗?
ProgramWorker 2002-02-27
  • 打赏
  • 举报
回复
自己用Winsock写吧。。。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧