您的位置:首页 > 移动开发

FTP客户端:FTP Client:win32 console appplication

2010-03-16 16:03 204 查看
#include

"stdafx.h"
#include

"iostream"
#include

<WinSock2.h>
#include

<IO.h>
using

namespace std;

#pragma

comment(lib,"ws2_32.lib")

int

main()
{

WORD wVersionRequested;

WSADATA wsaData;

int
err;
wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if
( err != 0 )
{

return
-1;
}

if
( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )

{

WSACleanup( );

return
-1;
}

SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(

"127.0.0.1"
);
addrSrv.sin_family = AF_INET;

addrSrv.sin_port = htons(21);

int
b;

b = connect(sockClient, (SOCKADDR*)&addrSrv,

sizeof
(SOCKADDR));

if
(b == SOCKET_ERROR)
{

cout<<

"fail"
<<endl;
}

char
recvBuf[100];
memset(recvBuf, 0, 100);

recv(sockClient,recvBuf,100,0);

cout<<recvBuf<<endl;

//send the user name

char
buffer[256];
memset(buffer,0,256);

strcpy(buffer,

"USER "
);
strcat(buffer,

"username"
);
strcat(buffer,

"/r/n"
);
send(sockClient,buffer + 0, strlen(buffer), 0);

memset(recvBuf, 0, 100);

recv(sockClient,recvBuf,100,0);

cout<<recvBuf<<endl;

//send the password

memset(buffer,0,256);

strcpy(buffer,

"PASS "
);
strcat(buffer,

"password"
);
strcat(buffer,

"/r/n"
);
send(sockClient,buffer + 0, strlen(buffer), 0);

memset(recvBuf, 0, 100);

recv(sockClient,recvBuf,100,0);

cout<<recvBuf<<endl;

//tell server the file should be downloaded

memset(buffer,0,256);

strcpy(buffer,

"SIZE "
);
strcat(buffer,

"OFFICE12.exe"
);
strcat(buffer,

"/r/n"
);
send(sockClient,buffer + 0, strlen(buffer), 0);

memset(recvBuf, 0, 100);

recv(sockClient,recvBuf,100,0);

cout<<recvBuf<<endl;

memset(buffer,0,256);

sprintf(buffer,

"PASV/r/n"
);
send(sockClient,buffer + 0, strlen(buffer), 0);

memset(recvBuf, 0, 100);

recv(sockClient,recvBuf,100,0);

cout<<recvBuf<<endl;

const char
* pdir;
pdir=strchr(recvBuf,

'('
);
pdir++;

printf(

"%s"
,pdir);

union

{

unsigned char
b[4];

unsigned __int32
ui;
}uip;

union

{

unsigned char
b[2];

unsigned __int16
hi;
}uport;

unsigned __int32
u32[6];
sscanf(pdir,

"%u,%u,%u,%u,%u,%u"
,&u32[0],&u32[1],&u32[2],&u32[3],&u32[4],&u32[5],&u32[6]);
uip.b[3] = (

unsigned char
)u32[0];
uip.b[2] = (

unsigned char
)u32[1];
uip.b[1] = (

unsigned char
)u32[2];
uip.b[0] = (

unsigned char
)u32[3];
uport.b[1] = (

unsigned char
)u32[4];
uport.b[0] = (

unsigned char
)u32[5];

// send the command to receive the file

memset(buffer,0,256);

sprintf(buffer,

"RETR %s/r/n","OFFICE12.exe"
);
send(sockClient,buffer + 0, strlen(buffer), 0);

memset(recvBuf, 0, 100);

recv(sockClient,recvBuf,100,0);

cout<<recvBuf<<endl;

SOCKET sockFile = socket(AF_INET, SOCK_STREAM, 0);

sockaddr_in myaddr;

memset(&myaddr, 0,

sizeof
(sockaddr_in));
myaddr.sin_family = AF_INET;

myaddr.sin_addr.S_un.S_addr = htonl(uip.ui);

myaddr.sin_port = htons(uport.hi);

b = connect(sockFile, (LPSOCKADDR)&myaddr, (

int)sizeof
(sockaddr_in));

if
(b == SOCKET_ERROR)
{

cout<<

"fail"
<<endl;
}

char

buffer1[4*4096];

//16KB

int

iresult = 0;
memset(buffer1,0,4*4096);

int

index = 0;
FILE* file=fopen(

"D://OFFICE12.exe","wb"
);

while

(true
)
{

++index;

iresult = recv(sockFile, buffer1, 4*4096, 0);

if

(iresult == 0)
{

break

;
}

fwrite(buffer1,

sizeof(char
),iresult,file);
}

cout<<index<<endl;

closesocket(sockClient);

WSACleanup();

cin.get();

return

1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: