我把它帖出来吧
#include <winsock.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "wininet.h"
#define MAX_ALLLEN 4096
int GetPort(char *buf,unsigned short&port);
int FtpFile(char *url,long& count);
int ChangeStr(char* buf)
{
int l = strlen(buf);
l--;
while(buf[l] == '\r' ||buf[l] == '\n' )
l--;
buf[l+1] = 0;
return 0;
}
/*
文件格式如:
ftp://22.108.33.3/5.rmftp://22.108.33.3/6.rm...
*/
int main(int argc,char** argv)
{
FILE *fp;
fp = fopen(argv[1],"r");
if(fp == 0)
return -1;
char buf[1024];
char url[1024];
long num=0,count=0;
while(fgets(buf,1024,fp))
{
ChangeStr(buf);
if(strnicmp(buf,"ftp://",6) == 0)
{
strcpy(url,buf+2);
FtpFile(url,count);
num++;
printf("num = %ld,count =%ld",num,count);
}
}
fclose(fp);
return 0;
}
int FtpFile(char *url,long &count)
{
WSADATA cWSAData;
if(WSAStartup(MAKEWORD(2, 2), &cWSAData))
return -1;
char szServer[256];
char szPath[256];
char szUser[256];
char szPwd[256];
URL_COMPONENTS urlcom;
memset(&urlcom, 0, sizeof(URL_COMPONENTS));
urlcom.dwStructSize = sizeof(URL_COMPONENTS);
urlcom.lpszHostName = szServer;
urlcom.dwHostNameLength = 255;
urlcom.lpszUrlPath = szPath;
urlcom.dwUrlPathLength = 255;
urlcom.lpszUserName = szUser;
urlcom.dwUserNameLength = 255;
urlcom.lpszPassword = szPwd;
urlcom.dwPasswordLength = 255;
int ret = InternetCrackUrl(url, strlen(url), 0, &urlcom);
if(ret == FALSE)
return 1;
SOCKET comm_socket,data_socket;
struct sockaddr_in comm_addr,data_addr;
//将域名转换成IP;
PHOSTENT hp;
if ( !isdigit(szServer[0]) )
{
hp = gethostbyname(szServer);
if (hp == NULL )
return 1;
memset(&comm_addr,0,sizeof(sockaddr_in));
memcpy(&comm_addr.sin_addr,hp->h_addr,hp->h_length);
comm_addr.sin_family = hp->h_addrtype;
comm_addr.sin_port = htons(urlcom.nPort);
}
else
{
memset(&comm_addr,0,sizeof(sockaddr_in));
comm_addr.sin_addr.s_addr=inet_addr(szServer);
comm_addr.sin_family =AF_INET;
comm_addr.sin_port = htons(urlcom.nPort);
}
comm_socket = socket(AF_INET,SOCK_STREAM,0);
// setsockopt(comm_socket,SOL_SOCKET ,SO_RCVTIMEO,(char *)&nTimeOut,sizeof(nTimeOut));
// setsockopt(comm_socket,SOL_SOCKET ,SO_SNDTIMEO,(char *)&nTimeOut,sizeof(nTimeOut));
ret=connect(comm_socket,(struct sockaddr *)&comm_addr,sizeof(comm_addr));
if(ret == SOCKET_ERROR)
{
closesocket(comm_socket);
return 1;
}
char buf[MAX_ALLLEN];
char username[300];
char password[300];
char command[300];
memset(buf,0,MAX_ALLLEN);
memset(username,0,300);
memset(password,0,300);
memset(command,0,256);
if(urlcom.lpszUserName[0] != 0)
sprintf(username,"USER %s\r\n",urlcom.lpszUserName);
else
sprintf(username,"USER anonymous\r\n");
// if(urlcom.lpszPassword[0] != 0)
sprintf(password,"PASS %s\r\n",urlcom.lpszPassword);
// else
// sprintf(password,"PASS my@company.com\r\n");
send(comm_socket,username,strlen(username),0);
ret = recv(comm_socket,buf,100,0);
Sleep(1000);
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
}
memset(buf,0,100);
send(comm_socket,password,strlen(password),0);
ret = recv(comm_socket,buf,100,0);
Sleep(1000);
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
}
memset(buf,0,100);
send(comm_socket,"TYPE I\r\n",8,0);
ret = recv(comm_socket,buf,100,0);
Sleep(1000);
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
}
memset(buf,0,100);
send(comm_socket,"PASV\r\n",6,0);
ret = recv(comm_socket,buf,100,0);
Sleep(1000);
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
}
sprintf(command,"SIZE %s\r\n",szPath);
send(comm_socket,command,sizeof(command),0);
ret = recv(comm_socket,buf,100,0);
if(!strstr(buf,"\r\n") || ret == 0)
{
closesocket(comm_socket);
return 1;
}
count++;
return 0;
}
int GetPort(char* buf,unsigned short &port)
{
if(buf == NULL)
return -1;
unsigned short port1 = 0,port2 = 0;
char *p = NULL;
p = strchr(buf,'(');
if(p == NULL)
return -1;
int flag = 0;
while(*p)
{
if(*p == ',')
{
flag++;
if(flag == 4)
port1 = atoi(p+1);
else if(flag == 5)
{
port2 = atoi(p+1);
break;
}
}
p++;
}
if(*p && port1 && port2)
{
port = port1 << 8;
port += port2;
}
return 0;
}