2 Star 0 Fork 1

hyw_code / FTP_Client

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
connection.c 6.49 KB
一键复制 编辑 原始数据 按行查看 历史
root 提交于 2015-04-09 18:20 . 111
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<string.h>
#include<strings.h>
#include<unistd.h>
#include<netinet/in.h>
#include<netdb.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
#include "fileutils.h"
#include "define.h"
#include "connection.h"
int login(int sockfd)
{
char sendbuf[MAX_BUF_SIZE] = {'\0'};
char recvbuf[MAX_BUF_SIZE] = {'\0'};
int ret = -1;
if(sockfd < 0){
return ret;
}
sprintf(sendbuf,FTP_COMMEND_USERNAME,FTP_USERNAME);
ret = send_socket(sockfd,sendbuf,strlen(sendbuf));
if(ret == -1){
printf("###%s(),send username failed!\n",__func__);
return -1;
}
ret = read_socket(sockfd,recvbuf,sizeof(recvbuf));
if(ret > 0){
if(strncmp(recvbuf,"331",3) == 0){
printf("###%s(),send commend username sucessful!\n",__func__);
}else{
printf("###%s(),send commend username failed!\n",__func__);
return -1;
}
}
sprintf(sendbuf,FTP_COMMEND_USERPASSWD,FTP_USERPASSWD);
ret = send_socket(sockfd,sendbuf,strlen(sendbuf));
if(ret == -1){
printf("###%s(),send userpasswd failed!\n",__func__);
return -1;
}
ret = read_socket(sockfd,recvbuf,sizeof(recvbuf));
if(ret > 0){
if(strncmp(recvbuf,"230",3) == 0){
printf("###%s(),send commend userpasswd sucessful!\n",__func__);
}else{
printf("###%s(),send commend userpasswd failed!\n",__func__);
return -1;
}
}
return 1;
}
int send_socket(int sockfd,const char *out_buf, int size)
{
int count = 0;
int ret = 0;
int len = 0;
if(!out_buf){
return -1;
}
count = 0;
len = (-1 == size) ? strlen(out_buf) : size;
while (count < len)
{
ret = write(sockfd, out_buf + count, len - count);
if (ret <= 0)
{
printf("len-court = %d\n",len-count);
perror("write");
return -1;
}
count += ret;
}
return 0;
}
int read_socket(int sockfd, char * buf,int size)
{
int len = 0;
if(!buf){
return -1;
}
memset(buf,0,size);
len = read(sockfd, buf, size);
return len;
}
int connect_to_ftpserver(char *host,int port)
{
struct sockaddr_in server;
struct hostent *hp = NULL;
int sockfd = -1;
char buf[MAX_BUF_SIZE] = {'\0'};
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd){
perror("socket");
return sockfd;
}
hp = gethostbyname(host);
if (NULL == hp){
perror("gethostbyname");
return -1;
}
memset(&server,0,sizeof(server));
server.sin_family = AF_INET;
memcpy((char *)&server.sin_addr, (char *)hp->h_addr, hp->h_length);
server.sin_port = htons(port);
if (connect(sockfd, (struct sockaddr *)&server, sizeof (server)) < 0){
perror("connect");
return -1;
}
if(port == FTP_SERVER_PORT){
read_socket(sockfd,buf,MAX_BUF_SIZE);
if(strncmp(buf,"220",3) == 0){
printf("###%s(),connect ftp server sucessful!\n",__func__);
}else{
close(sockfd);
return -1;
}
}
return sockfd;
}
//portģʽ£׽
int make_server_sock(int port)
{
struct sockaddr_in saddr;
int sock_id;
sock_id = socket(PF_INET,SOCK_STREAM,0);
if(sock_id <0){
printf("sock_id failed\n");
return -1;
}
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = htons(port);
saddr.sin_family = AF_INET;
if(bind(sock_id,(struct sockaddr*)&saddr,sizeof(saddr))!=0){
printf("bind failed\n");
return -1;
}
if(listen(sock_id,1)!=0){
printf("listen failed\n");
return -1;
}
return sock_id;
}
int ftp_pasv(int sockfd)
{
char recvbuf[MAX_BUF_SIZE] = {'\0'};
int result[6] = {'\0'};
char ip[32] = {'\0'};
int port = -1;
int ret = -1;
if(sockfd < 0){
return -1;
}
ret = send_socket(sockfd,FTP_COMMEND_PASV,strlen(FTP_COMMEND_PASV));
if(ret == -1){
printf("###%s(),send ftp pasv failed!\n",__func__);
return -1;
}
ret = read_socket(sockfd,recvbuf,sizeof(recvbuf));
if(ret > 0){
if(strncmp(recvbuf,"227",3) == 0){
printf("###%s(),send commend pasv sucessful!\n",__func__);
}else{
printf("###%s(),send commend pasv failed!\n",__func__);
return -1;
}
}
printf("pasv is : %s\n",recvbuf);
sscanf(recvbuf,FTP_PASV_PARSE_RESULTS,&result[0],&result[1],&result[2],&result[3],&result[4],&result[5]);
sprintf(ip,"%d.%d.%d.%d",result[0],result[1],result[2],result[3]);
port = result[4] * 256 + result[5];
printf("###%s(),ip:%s,port:%d\n",__func__,ip,port);
return connect_to_ftpserver(ip,port);
}
static int addrs = 1;
int ftp_port(int sockfd)
{
char recvbuf[MAX_BUF_SIZE] = {'\0'};
char sendbuf[MAX_BUF_SIZE] = {'\0'};
int result[6] = {192,168,154,136,100,'\0'};
int port;
int ret = -1;
// srand((unsigned)time(NULL));
// result[5]=rand()%100;
addrs++;
result[5]=addrs;
port = 100*256+result[5];
sprintf(sendbuf,FTP_COMMEND_PORT,result[0],result[1],result[2],result[3],result[4],result[5]);
printf("%s",sendbuf);
ret = send_socket(sockfd,sendbuf,strlen(sendbuf));
if(ret == -1){
printf("###%s(),send ftp pasv failed!\n",__func__);
return -1;
}
ret = read_socket(sockfd,recvbuf,sizeof(recvbuf));
if(ret > 0){
printf("the recv buf is %s\n",recvbuf);
if(strncmp(recvbuf,"200",3) == 0){
printf("###%s(),send commend port sucessful!\n",__func__);
return make_server_sock(port);
}else{
printf("###%s(),send commend pasv failed!\n",__func__);
return -1;
}
}
}
int ftp_close_datasockfd(int sockfd,int datasockfd)
{
char recvbuf[MAX_BUF_SIZE] = {'\0'};
if(sockfd < 0 || datasockfd < 0){
return -1;
}
close(datasockfd);
read_socket(sockfd,recvbuf,sizeof(recvbuf));
printf("close databuf is: %s\n",recvbuf);
if(strncmp(recvbuf,"226",3) == 0){
printf("###%s(),send commend 226 get file sucessful!\n",__func__);
return 0;
}
printf("###%s(),send commend get file failed!\n",__func__);
return -1;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/hywcode/FTP_Client.git
git@gitee.com:hywcode/FTP_Client.git
hywcode
FTP_Client
FTP_Client
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891