#include <WINSOCK2.H>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <WININET.h>
WSADATA wsaData;
struct hostent *he;
struct sockaddr_in target;
char *check_data(SOCKET s);
main()
{
char command[50]="",user[30]="",pass[30]="",server[30]="",buffer[500]="",ip[20]="";
char filename[30]="";
char pt1[3]="",pt2[3];
char *filebuf;
SOCKET fsock,send_sock;
int port=21,i,j,count,param1,param2,data_port,err;
HANDLE hFile;
DWORD nm;
err=WSAStartup(MAKEWORD(1,1),&wsaData);
if (err!=NO_ERROR){
printf("WSAStartup failed with error: %d\n", err);
return 0;
}
strcpy(user,"123"); //вместо бла бла пишем логин
strcpy(pass,"321"); //пароль
strcpy(server,"127.0.0.1"); // адрес ftp сервера
strcpy(filename,"C:/denwer/1.txt"); //имя файла который будет передан
fsock=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); //создаём сокет
if(fsock==INVALID_SOCKET)
{
printf("Socket error\n");
return 0;
}
he=gethostbyname(server);
target.sin_family = AF_INET;
target.sin_port = htons (port);
target.sin_addr = *((struct in_addr *)he->h_addr);
if (connect(fsock, &target, sizeof(target)) == SOCKET_ERROR) {
printf("can't create connection\n");
return 0;
}
strcpy(command,"USER "); strcat(command,user); strcat(command,"\r\n");
send(fsock,command,strlen(command),0); //отправляем логин
if(check_data(fsock)==FALSE) { printf("Bad login\n"); return 0;}
strcpy(command,"PASS "); strcat(command,pass); strcat(command,"\r\n");
send(fsock,command,strlen(command),0); //отправляем пароль
if(check_data(fsock)==FALSE) { printf("Bad password\n"); return 0;}
printf("Auth complete\n");
strcpy(command,"PWD\r\n"); //получим текщий каталог
send(fsock,command,strlen(command),0);
if(check_data(fsock)==FALSE) { printf("Can't locate current directory on server\n"); return 0;}
strcpy(command,"PASV\r\n");
send(fsock,command,strlen(command),0);
if(check_data(fsock)==FALSE) { printf("passive mod-failed\n"); return 0;}
i=1;j=0;count=0;
while(TRUE)
{
if(j==4) break;
if(buffer[i]==',') { j++; ip[count++]='.'; }
ip[count++]=buffer[i++]; //вытаскиваем ip из ответа
}
i++;
while(TRUE)
{
if(buffer[i]==',') break;
pt1[count++]=buffer[i++];
}
i++;
while(0==0)
{
if(buffer[i]=='>') break;
pt2[count++]=buffer[i++];
}
param1=atoi(pt1);
param1*=256;
param2=atoi(pt2);
data_port=param1+param2;
send_sock=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
he=gethostbyname(ip);
target.sin_family = AF_INET;
target.sin_port = htons (data_port);
target.sin_addr = *((struct in_addr *)he->h_addr);
connect(send_sock, &target, sizeof(target));
hFile=CreateFile(filename,GENERIC_READ, FILE_READ_DATA,NULL,OPEN_EXISTING,0,0);
filebuf=malloc(sizeof(char)*GetFileSize(hFile,NULL ));
ReadFile(hFile,filebuf,GetFileSize(hFile,NULL),&nm ,NULL);
CloseHandle(hFile);
strcpy(command,"STOR "); strcat(command,filename);
send(fsock,command,strlen(command),0);
send(send_sock,filebuf,strlen(filebuf),0);
if(check_data(send_sock)==FALSE) { printf("Can't locate current directory on server\n"); return 0;}
free(filebuf);
if(check_data(fsock)==FALSE) { printf("file transfer failed\n"); return 0;}
printf("File delivered\n");
closesocket(fsock); closesocket(send_sock);
return 0;
}
char *check_data(SOCKET s)
{
char buffer[500]="";
if(recv(s,buffer,sizeof(buffer),0)==-1) {
printf("ошибка при приёме данных\n");
exit(-1);
}
if(buffer[0]=='5' || buffer[0]=='4') return FALSE;
return buffer;
}
1>------ Построение начато: проект: ftp2, Конфигурация: Debug Win32 ------
1>Компиляция...
1>ftp21.cpp
1>c:\documents and settings\projects\ftp2\ftp2\ftp21.cpp(15) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\documents and settings\projects\ftp2\ftp2\ftp21.cpp(51) : error C2664: connect: невозможно преобразовать параметр 2 из 'sockaddr_in *' в 'const sockaddr *'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>c:\documents and settings\projects\ftp2\ftp2\ftp21.cpp(115) : error C2664: connect: невозможно преобразовать параметр 2 из 'sockaddr_in *' в 'const sockaddr *'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>c:\documents and settings\projects\ftp2\ftp2\ftp21.cpp(117) : error C2664: CreateFileW: невозможно преобразовать параметр 1 из 'char [30]' в 'LPCWSTR'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>c:\documents and settings\projects\ftp2\ftp2\ftp21.cpp(118) : error C2440: =: невозможно преобразовать 'void *' в 'char *'
1> Для преобразования 'void*' к указателю на тип, не являющемуся 'void', требуется явное приведение
1>c:\documents and settings\projects\ftp2\ftp2\ftp21.cpp(148) : warning C4172: возвращение адреса локальной или временной переменной
1>Журнал построения был сохранен в "file://c:\Documents and Settings\Projects\ftp2\ftp2\Debug\BuildLog.htm"
1>ftp2 - ошибок 5, предупреждений 1
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========