- 論壇徽章:
- 0
|
// FTP.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
//=======================
//演示代碼,沒(méi)有錯(cuò)誤處理,盡量簡(jiǎn)化了流程
//=========================
#include "stdafx.h"
#include <winsock.h>
#include <windows.h>
#include <stdio.h>
#pragma comment (lib,"Ws2_32"
//====以下是STL庫(kù)
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//因?yàn)槭茄菔敬a,所以申明了全局變量,請(qǐng)不要效仿
char Buff[1024];
SOCKET listenFD=NULL;
//================================
int recvbuff()
{
ZeroMemory(Buff,1024); //清0
int ret = recv(listenFD,Buff,1024,0);
printf(Buff);
return 0;
}
int main(int argc, char *argv[])
{
struct sockaddr_in my;
my.sin_family=AF_INET;
my.sin_addr.s_addr=inet_addr("192.168.18.119" ;
my.sin_port=htons(21);
WSADATA wsadata;
BOOL ThreadFlag=FALSE;
DWORD ThreadID=0;
int nRet=0;
nRet=WSAStartup(MAKEWORD(2,2),&wsadata); //初始化
listenFD=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
while (1)
{
nRet=connect(listenFD,(struct sockaddr*)&my,sizeof (struct sockaddr));
if (nRet!=SOCKET_ERROR)
{
break;
}
}
recvbuff(); //接收服務(wù)器版本信息
//==================================
char user[] = "USER admin\r\n";
char pass[] = "admin\r\n";
send(listenFD,user,sizeof(user),0);
recvbuff();
//==========================================
send(listenFD,pass,sizeof(pass),0);
recvbuff();
//=================================
char type[] = "TYPE I\r\n";
send(listenFD,type,sizeof(type),0); //更改傳輸類(lèi)型為二進(jìn)制
recvbuff();
//==========================================
//更改路徑命令是 CWD
//================================
char pasv[] = " ASV\r\n";
send(listenFD,pasv,sizeof(pasv),0); //更改傳輸類(lèi)型為二進(jìn)制
recvbuff();
//=======================================
//以下代碼摘自我的FTP客戶端,使用了 string 對(duì)象,
//作用是處理服務(wù)器發(fā)回的 PASV 信息,得到把其中的IP和端口
//發(fā)回的格式為 227 Entering Passive Mode (192,168,18,119,11,7 ..
// 192,168,18,119 = 192.168.18.119
// 端口 = 11*256 + 78
//========================================
string ifstr = Buff; //把返回信息傳給 string 對(duì)像,string 是STL中的字符串對(duì)象
string::size_type pos = 0; //長(zhǎng)度,當(dāng)整型吧,size_type是為了跨平臺(tái)
string::size_type slen = ifstr.find("(" +1; // find 是指查找字符 "(" 的位置,返回長(zhǎng)度
string::size_type dlen = 0 ;
int i = 0 ;
for( i ; i < 4 ; i++) //把IP地址中的 "," 換成 "."
{
dlen = ifstr.find(",",dlen);
ifstr.replace(dlen,1,"." ;
dlen++;
}
string ip = ifstr.substr(slen,dlen-slen-1); //把IP地址提出來(lái)
//==================================== //把端口提出來(lái)
string temport;
u_short uport;
slen = dlen;
dlen = ifstr.find("," ;
temport = ifstr.substr( slen , dlen - slen); //slen 起始地址,第二參數(shù)表示 以第一個(gè)地址copy出的字節(jié)數(shù)
uport = atoi( temport.c_str()) * 256 ;
//=====================================
slen = dlen + 1;
dlen = ifstr.find(" ",slen) ;
temport = ifstr.substr(slen,dlen - slen);
uport += atoi( temport.c_str());
//====================================
//分析返回的PASV信息完成,開(kāi)始數(shù)據(jù)通道連接
//===================================
SOCKET ssock=NULL;
ssock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in server;
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr(ip.c_str());
server.sin_port=htons(uport);
while (1)
{
nRet=connect(ssock,(struct sockaddr*)&server,sizeof (struct sockaddr));
if (nRet!=SOCKET_ERROR)
{
break;
}
}
printf("數(shù)據(jù)通道連接成功\n" ;
//==============================================
//==========================================
char stor[] = "STOR 測(cè)試.rar\r\n"; //上傳文件
send(listenFD,stor,sizeof(stor),0);
recvbuff();
//=======================================
FILE *fp = NULL; //打開(kāi)文件
fp = fopen( "c:\\測(cè)試.rar","rb" ; //只讀打開(kāi)二進(jìn)制文件
//============================================
char filebuff[1024] ; //發(fā)送文件緩沖
long ret; //實(shí)際發(fā)送的字節(jié)數(shù)
printf("開(kāi)始發(fā)送文件......" ;
while( fread(filebuff,1,1024,fp) ) //接收文件只到全部讀完
{
slen = 1024;
while( slen ) //不停發(fā)送,只到全部發(fā)送完成
{
ret = send(ssock,filebuff,1024,0);
Sleep(0);
slen -= ret;
}
ZeroMemory(filebuff,1024);
}
closesocket(ssock);
printf("發(fā)送完成" ;
return 0;
} |
|