- 论坛徽章:
- 0
|
在网上搜索了一些ftp客户端程序,然后自己做了些改动,编译通过,但是执行有问题,请高手帮忙调试,谢谢!
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define FTP_PORT 21
#define MAXBACKLOG 30
void die(char *mess)
{
perror(mess);
exit(1);
}
static int saferecv(int fd, char *buf, int size)
{
int ret;
if ((ret = recv(fd, buf, size, 0)) < 0)
{
die("recv error" ;
}
return ret;
}
static int safesend(int fd, char *buf, int size)
{
int ret;
if ((ret = send(fd, buf, size, 0)) < 0)
{
die("send error" ;
}
return ret;
}
static int connect_ftp(char *ip, char *username, char *password)
{
int sockfd, port;
struct sockaddr_in server;
char buff[1024];
port = FTP_PORT;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
die("socket failed" ;
}
server.sin_family = AF_INET;
server.sin_port = htons((unsigned short)port);
server.sin_addr.s_addr = inet_addr(ip);
if (connect(sockfd, (struct sockaddr *)&server , sizeof(server)) < 0)
{
die("connect failed" ;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
if (strstr(buff, "220" == NULL)
{
die("connection refused by remote ftp server\n" ;
close(sockfd);
}
memset(buff, 0, sizeof(buff));
sprintf(buff, "USER %s\r\n", username);
if (safesend(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0) {
close(sockfd);
return -1;
}
if (strstr(buff, "331" == NULL)
{
die("ERROR:connection refused by remote ftp server\n" ;
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
sprintf(buff, " ASS %s\r\n", password);
if (safesend(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
if (strstr(buff, "230" == NULL)
{
die("ERROR:username and password not match\n" ;
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
sprintf(buff, "SYST\r\n");
if (safesend(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
sprintf(buff, "TYPE I\r\n");
if (safesend(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
return sockfd;
}
static int create_dataconn(int sockfd, char *localip, int localport)
{
int on = 1, l_i;
int localsock;
struct sockaddr_in localserver;
if((localsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
die("socket() failed");
close(sockfd);
return -1;
}
if (setsockopt(localsock, SOL_SOCKET, SO_REUSEADDR,
(char *)&on, sizeof(on)) < 0)
{
die("setsockopt() failed");
close(sockfd);
close(localsock);
return -1;
}
localserver.sin_family = AF_INET;
localserver.sin_addr.s_addr = INADDR_ANY;
localserver.sin_port = htons((unsigned short)localport);
if ((bind(localsock, (struct sockaddr *)&localserver, sizeof(localserver)) < 0))
{
/*put_log("ERROR:%s\n", strerror(errno)); */
die("bind failed");
close(sockfd);
close(localsock);
return -1;
}
if (listen(localsock, MAXBACKLOG) < 0)
{
die("listen failed");
close(sockfd);
close(localsock);
return -1;
}
/*if (get_localip(localip) == -1)
{
put_log("ERROR:get_localip\n");
close(sockfd);
close(localsock);
return -1;
}
for (l_i = 0; l_i < strlen (localip); l_i++)
if (localip[l_i] == '.')
localip[l_i] = ',';*/
return localsock;
}
int upload(char *ftpserver, char *username, char *password, char *filename)
{
int sockfd, localsock, dsock;
int localport;
int fd;
struct sockaddr_in remote;
int remote_len;
char buff[1024];
char localip[256] = "192.24.88.4";
int dwRead;
int dw;
if ((sockfd = connect_ftp(ftpserver, username, password)) < 0)
{
die("ERROR:connect_ftp\n");
return -1;
}
/*use random number as port for ftpdata bind*/
localport = (rand () % 20000) + 2000;
if ((localsock = create_dataconn(sockfd, localip, localport)) < 0)
{
die("ERROR:data_ftp\n");
return -1;
}
memset(buff, 0, sizeof(buff));
sprintf(buff, " ORT %s,%d,%d\r\n", localip, localport / 256, localport % 256);
if (safesend(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
close(localsock);
return -1;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
return -1;
}
if (strstr(buff, "200") == NULL)
{
die("Unable to get valid data\n");
close(sockfd);
close(localsock);
return -1;
}
memset(buff, 0, sizeof(buff));
sprintf (buff, "STOR %s\r\n", filename);
if (safesend (sockfd, buff, sizeof(buff)) < 0)
{
close (sockfd);
close (localsock);
return -1;
}
memset(buff, 0, sizeof(buff));
if (saferecv(sockfd, buff, sizeof(buff)) < 0)
{
close(sockfd);
close(localsock);
return -1;
}
if (strstr(buff, "150") == NULL)
{
die("ERROR:Unable to get valid data\n");
close(sockfd);
close(localsock);
return -1;
}
if ((dsock = accept (localsock, (struct sockaddr *) &remote, &remote_len)) < 0)
{
die("ERROR:accept");
close(sockfd);
close(localsock);
return -1;
}
close(localsock);
if ((fd = open(filename, O_RDONLY)) < 0)
{
die("ERROR pen");
close (sockfd);
close (dsock);
return -1;
}
dwRead = 0;
dw = 0;
while (1)
{
memset(buff, 0, sizeof(buff));
dwRead = read(fd, buff, sizeof(buff));
if (dwRead <= 0) {
break;
}
dw = safesend(dsock, buff, dwRead);
if (dw < 0)
{
close (sockfd);
close (dsock);
return -1;
}
if (dwRead != sizeof(buff))
{
break;
}
}
close(fd);
close(dsock);
memset(buff, 0, sizeof(buff));
saferecv(sockfd, buff, sizeof(buff));
while (strstr (buff, "226") == NULL)
{
memset(buff, 0, sizeof(buff));
saferecv(sockfd, buff, sizeof(buff));
}
sprintf(buff, "QUIT\r\n");
safesend(sockfd, buff, sizeof(buff));
saferecv(sockfd, buff, sizeof(buff));
close(sockfd);
return 0;
}
int main(int argc, char *argv[])
{
char *ftpserver="192.24.1.13";
char *username="tmp";
char *password="tmp";
char *filename="ftpd.c";
upload(ftpserver, username, password, filename);
} |
|