update ftpclient
This commit is contained in:
parent
aa33a49890
commit
eb67b45f0f
|
@ -30,37 +30,37 @@ http://license.coscl.org.cn/MulanPSL2
|
|||
char sendBuffer[1024];
|
||||
char recvBuffer[1024];
|
||||
int cmd_fd;
|
||||
|
||||
static char tcp_demo_ipaddr[] = {192, 168, 130, 77};
|
||||
static char tcp_demo_netmask[] = {255, 255, 254, 0};
|
||||
static char tcp_demo_gwaddr[] = {192, 168, 130, 1};
|
||||
|
||||
//quoted from https://kerndev.blog.csdn.net/article/details/89383888
|
||||
int SendCommand(char *cmd)
|
||||
{
|
||||
int ret;
|
||||
int fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
ret = send(fd, cmd, (int)strlen(cmd),0);
|
||||
closesocket(fd);
|
||||
ret = send(cmd_fd, cmd, (int)strlen(cmd),0);
|
||||
if (ret < 0) {
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
int RecvRespond(char * respond,int len)
|
||||
{
|
||||
int ret;
|
||||
int off;
|
||||
len -= -1;
|
||||
int fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
for (off = 0;off < len;off += ret) {
|
||||
ret = recv(fd,&respond[off],1,0);
|
||||
ret = recv(cmd_fd,&respond[off],1,0);
|
||||
if(ret < 0 ){
|
||||
printf("recv respond error\r\n");
|
||||
closesocket(fd);
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
if(respond[off] == '\n'){
|
||||
break;
|
||||
}
|
||||
}
|
||||
respond[off + 1] = 0;
|
||||
closesocket(fd);
|
||||
return atoi(respond);
|
||||
}
|
||||
int EnterPasv(uint8_t *ipaddr,int *port)
|
||||
|
@ -69,19 +69,20 @@ int EnterPasv(uint8_t *ipaddr,int *port)
|
|||
char *find;
|
||||
int ip1,ip2,ip3,ip4,tmp1,tmp2;
|
||||
ret = SendCommand("PASV\r\n");
|
||||
if(ret != 1){
|
||||
return 0;
|
||||
if(ret == -1){
|
||||
printf("failed to send command\n");
|
||||
return -1;
|
||||
}
|
||||
ret=RecvRespond(recvBuffer,1024);
|
||||
if(ret == -1 ){
|
||||
printf("failed to get presond\n");
|
||||
return -1;
|
||||
}
|
||||
if(ret != 227){
|
||||
return 0;
|
||||
printf("failed to enter pasv mod\n");
|
||||
}
|
||||
find=strrchr(recvBuffer,'(');
|
||||
sscanf(find,"(%d,%d,%d,%d,%d,%d)",&ip1,&ip2,&ip3,&ip4,&tmp1,&tmp2);
|
||||
ipaddr[0] = ip1;
|
||||
ipaddr[1] = ip2;
|
||||
ipaddr[2] = ip3;
|
||||
ipaddr[3] = ip4;
|
||||
sscanf(find,"(%d,%d,%d,%d,%d,%d)",&ipaddr[0],&ipaddr[1],&ipaddr[2],&ipaddr[3],&tmp1,&tmp2);
|
||||
*port = tmp1 * 256 + tmp2;
|
||||
return 1;
|
||||
}
|
||||
|
@ -95,50 +96,54 @@ int Login(uint8_t addr[4],int port,char *username,char *password)
|
|||
tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3]));
|
||||
memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero));
|
||||
ret = connect(cmd_fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr));
|
||||
if(ret != 1){
|
||||
if(ret == -1){
|
||||
printf("connect server failed\r\n");
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
printf("connect ok.\r\n");
|
||||
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret != 220){
|
||||
printf("bad server ret=%d\r\n",ret);
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
printf("login....\r\n");
|
||||
sprintf(sendBuffer,"USER %s\r\n",username);
|
||||
ret = SendCommand(sendBuffer);
|
||||
|
||||
if(ret != 1){
|
||||
return 0;
|
||||
if(ret == -1){
|
||||
return -1;
|
||||
}
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret == 220)ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret != 331){
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
sprintf(sendBuffer,"PASS %s\r\n",password);
|
||||
ret = SendCommand(sendBuffer);
|
||||
if(ret != 1){
|
||||
return 0;
|
||||
if(ret == -1){
|
||||
printf("failed to send command\n");
|
||||
return -1;
|
||||
}
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret != 230){
|
||||
return 0;
|
||||
printf("failed to get respond\n");
|
||||
return -1;
|
||||
}
|
||||
printf("login sucess \r\n");
|
||||
|
||||
|
||||
ret = SendCommand("TYPE I\r\n");
|
||||
if(ret != 1){
|
||||
return 0;
|
||||
if(ret == -1){
|
||||
printf("failed to send command\n");
|
||||
return -1;
|
||||
}
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret != 200){
|
||||
return 0;
|
||||
printf("failed to get respond\n");
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
int GetFileSize(char * name)
|
||||
{
|
||||
|
@ -146,7 +151,8 @@ int GetFileSize(char * name)
|
|||
int size;
|
||||
sprintf(sendBuffer,"SIZE %s\r\n",name);
|
||||
ret = SendCommand(sendBuffer);
|
||||
if(ret != 1){
|
||||
if(ret == -1){
|
||||
printf("failed to send command\n");
|
||||
return 0;
|
||||
}
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
|
@ -159,7 +165,7 @@ int GetFileSize(char * name)
|
|||
}
|
||||
int Download(char *name)
|
||||
{
|
||||
int fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
int data_fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
int len = GetFileSize(name);
|
||||
char *buf = malloc(len+1);
|
||||
printf("downloading file %s\r\n",name);
|
||||
|
@ -168,34 +174,33 @@ int Download(char *name)
|
|||
uint8_t addr[4];
|
||||
int port;
|
||||
ret = EnterPasv(addr,&port);
|
||||
|
||||
if(ret != 1){
|
||||
closesocket(fd);
|
||||
return 0;
|
||||
if(ret == -1){
|
||||
closesocket(data_fd);
|
||||
return -1;
|
||||
}
|
||||
struct sockaddr_in tcp_sock;
|
||||
tcp_sock.sin_family = AF_INET;
|
||||
tcp_sock.sin_port = htons(port);
|
||||
tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(addr[0],addr[1],addr[2],addr[3]));
|
||||
ret = connect(fd,(struct sockaddr *)&addr,port);
|
||||
if(ret != 1){
|
||||
closesocket(fd);
|
||||
memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero));
|
||||
ret = connect(data_fd,(struct sockaddr *)&tcp_sock,sizeof(struct sockaddr));
|
||||
if(ret == -1){
|
||||
printf("fail to connect data port\r\n");
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
sprintf(sendBuffer,"RETR %s\r\n",name);
|
||||
ret = SendCommand(sendBuffer);
|
||||
if(ret != 1){
|
||||
closesocket(fd);
|
||||
return 0;
|
||||
if(ret == -1){
|
||||
closesocket(data_fd);
|
||||
return -1;
|
||||
}
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret!=150){
|
||||
closesocket(fd);
|
||||
return 0;
|
||||
closesocket(data_fd);
|
||||
return -1;
|
||||
}
|
||||
for(it = 0;it < len;it += ret){
|
||||
ret = recv(fd,((char *)buf + it),len,0);
|
||||
ret = recv(data_fd,((char *)buf + it),len,0);
|
||||
if(ret<0){
|
||||
printf("download was interupted\r\n");
|
||||
break;
|
||||
|
@ -205,15 +210,17 @@ int Download(char *name)
|
|||
printf("download %d/%d bytes complete. \r\n",it,len);
|
||||
ret = RecvRespond(recvBuffer,1024);
|
||||
if(ret != 226){
|
||||
closesocket(fd);
|
||||
return 0;
|
||||
closesocket(data_fd);
|
||||
return -1;
|
||||
}
|
||||
closesocket(fd);
|
||||
closesocket(data_fd);
|
||||
|
||||
printf("creating file %s ....\r\n",name);
|
||||
int file=open(name,O_RDWR | O_CREAT);
|
||||
if(file > 0){
|
||||
ret = write(fd,buf,strlen(buf));
|
||||
printf("%d\n",file);
|
||||
ret = write(file,buf,strlen(buf));
|
||||
printf("%d\n",ret);
|
||||
if(ret < 0 ){
|
||||
printf("write failed\r\n");
|
||||
}
|
||||
|
@ -225,12 +232,27 @@ int Download(char *name)
|
|||
if(buf != NULL){
|
||||
free(buf);
|
||||
}
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CreateTestFile()
|
||||
{
|
||||
int fd = open("/test.txt",O_RDWR | O_CREAT);
|
||||
if(fd>0){
|
||||
printf("%d\n",fd);
|
||||
char * hello="hello";
|
||||
int ret = write(fd,hello,sizeof(hello));
|
||||
printf("%d\n",ret);
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
int TestFtp()
|
||||
{
|
||||
|
||||
CreateTestFile();
|
||||
|
||||
lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr);
|
||||
|
||||
cmd_fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
uint8_t ip[4] = { 192,168,130,70 };
|
||||
|
|
Loading…
Reference in New Issue