#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;
}