c++为什么发送list从ftp数据ftp被动模式端口设置接受目录信息出现乱码烫烫

1105人阅读
网络基础(25)
Linux(32)
C/C++(58)
#ifndef CLIENT_H_
#define CLIENT_H_
#include &sys/socket.h&
#include &unistd.h&
#include &fcntl.h&
#include &stdio.h&
#include &stdlib.h&
#include &sys/types.h&
#include &sys/ioctl.h&
#include &netinet/in.h&
#include &sys/stat.h&
#include &netdb.h&
#include &errno.h&
#include &arpa/inet.h&
#include &sys/stat.h&
#include &string&
#include &list&
#define INVALID_SOCKET
#define FTP_API
#define MAX_PATH
#define trace
#define FTP_PARAM_BASE
#define FTP_DEFAULT_PORT
//FTP默认端口号
#define FTP_DEFAULT_BUFFER
//FTP下载缓冲默认大小
#define FTP_DEFAULT_PATH
&/mnt/dvs/&
//FTP默认保存路径
#define FTP_COMMAND_BASE
#define FTP_COMMAND_END
FTP_COMMAND_BASE + 30
#define FTP_COMMAND_USERNAME
FTP_COMMAND_BASE + 1
#define FTP_COMMAND_PASSWORD
FTP_COMMAND_BASE + 2
#define FTP_COMMAND_QUIT
FTP_COMMAND_BASE + 3
#define FTP_COMMAND_CURRENT_PATH FTP_COMMAND_BASE + 4
// 获取文件路径
#define FTP_COMMAND_TYPE_MODE
FTP_COMMAND_BASE + 5
// 改变传输模式
#define FTP_COMMAND_PSAV_MODE
FTP_COMMAND_BASE + 6
// 被动端口模式
#define FTP_COMMAND_DIR
FTP_COMMAND_BASE + 7
// 获取文件列表
#define FTP_COMMAND_CHANGE_DIRECTORY FTP_COMMAND_BASE + 8
// 改变路径
#define FTP_COMMAND_DELETE_FILE
FTP_COMMAND_BASE + 9
// 删除文件
#define FTP_COMMAND_DELETE_DIRECTORY FTP_COMMAND_BASE + 10
// 删除目录/文件夹
#define FTP_COMMAND_CREATE_DIRECTORY FTP_COMMAND_BASE + 11
// 创建目录/文件夹
#define FTP_COMMAND_RENAME_BEGIN
FTP_COMMAND_BASE
// 开始重命名
#define FTP_COMMAND_RENAME_END
FTP_COMMAND_BASE + 13
// 重命名结束
#define FTP_COMMAND_FILE_SIZE
FTP_COMMAND_BASE + 14
// 获取文件大小
#define FTP_COMMAND_DOWNLOAD_POS FTP_COMMAND_BASE + 15
// 下载文件从指定位置开始
#define FTP_COMMAND_DOWNLOAD_FILE FTP_COMMAND_BASE + 16
// 下载文件
#define FTP_COMMAND_UPLOAD_FILE
FTP_COMMAND_BASE + 17
// 上传文件
#define FTP_COMMAND_APPEND_FILE
FTP_COMMAND_BASE + 18
// 追加上载文件
login2Server
inputUserName
inputPassWord
class CFTPManager
enum type {
binary = 0x31,
CFTPManager(void);
virtual ~CFTPManager(void);
// ! 登陆服务器
FTP_API login2Server(const std::string &serverIP);
// !输入用户名
FTP_API inputUserName(const std::string &userName);
// !输入密码
FTP_API inputPassWord(const std::string &password);
// !退出FTP
FTP_API quitServer(void);
// !命令: PWD
const std::string PWD();
// !设置传输格式 2进制
还是ascii方式传输
FTP_API setTransferMode(type mode);
// !设置为被动模式
const std::string Pasv();
// ! 命令: DIR
const std::string Dir(const std::string &path);
// !命令 : CD
FTP_API CD(const std::string &path);
// !删除文件
FTP_API DeleteFile(const std::string &strRemoteFile);
// ! 删除文件夹/目录
FTP_API DeleteDirectory(const std::string &strRemoteDir);
// ! 创建目录/文件夹
FTP_API CreateDirectory(const std::string &strRemoteDir);
// !重命名
FTP_API Rename(const std::string &strRemoteFile, const std::string &strNewFile);
// !获取文件大小
long getFileLength(const std::string &strRemoteFile);
// !关闭连接
void Close(int sock);
// 下载文件
FTP_API Get(const std::string &strRemoteFile, const std::string &strLocalFile);
// 上载文件
支持断电传送方式
FTP_API Put(const std::string &strRemoteFile, const std::string &strLocalFile);
// !合成发送到服务器的命令
const std::string parseCommand(const unsigned int command, const std::string &strParam);
// ! 建立连接
FTP_API Connect(int socketfd, const std::string &serverIP, unsigned int nPort);
// ! 返回服务器信息
const std::string serverResponse(int sockfd);
// !获取服务器数据
FTP_API getData(int fd, char *strBuf, unsigned long length);
// !发送命令
FTP_API Send(int fd, const std::string &cmd);
// !发送命令
FTP_API Send(int fd, const char *cmd, const size_t len);
// !建立数据连接
FTP_API createDataLink(int data_fd);
// !解析PASV模式返回的字符串获取FTP端口号和FTP服务器IP
FTP_API ParseString(std::list&std::string& strArray, unsigned long & nPort ,std::string & strServerIp);
// 打开本地文件
FILE *createLocalFile(const std::string &strLocalFile);
// 下载文件
FTP_API downLoad(const std::string &strRemoteFile, const std::string &strLocalFile, const int pos = 0, const unsigned int length = 0);
// 解析返回ftp命令的值
FTP_API parseResponse(const std::string &str);
//!控制连接套接字
// !当前用户名
std::string m_strUserN
// !当前用户密码
std::string m_strPassW
// !服务器的IP
std::string m_strServerIP;
// !服务器Port
unsigned int m_nServerP
// !服务器回应信息缓存
std::string m_strR
// !保存命令参数
std::string m_commandS
// !当前使用的命令参数
unsigned int m_nCurrentC
// !是否登陆标志。
#include &../Source/FTPManager.h&
static int SplitString( std::string strSrc, std::list&std::string& &strArray , std::string strFlag)
int pos = 1;
while((pos = (int)strSrc.find_first_of(strFlag.c_str())) & 0)
strArray.insert(strArray.end(), strSrc.substr(0 , pos));
strSrc = strSrc.substr(pos + 1, strSrc.length() - pos - 1);
strArray.insert(strArray.end(), strSrc.substr(0, strSrc.length()));
CFTPManager::CFTPManager(void): m_bLogin(false)
m_cmdSocket = socket(AF_INET, SOCK_STREAM, 0);
CFTPManager::~CFTPManager(void)
std::string strCmdLine = parseCommand(FTP_COMMAND_QUIT, &&);
Send(m_cmdSocket, strCmdLine.c_str());
close(m_cmdSocket);
m_bLogin =
FTP_API CFTPManager::login2Server(const std::string &serverIP)
std::string strP
int pos = serverIP.find_first_of(&:&);
if (pos & 0)
strPort = serverIP.substr(pos + 1, serverIP.length() - pos);
pos = serverIP.length();
strPort = FTP_DEFAULT_PORT;
m_strServerIP = serverIP.substr(0, pos);
m_nServerPort = atol(strPort.c_str());
trace(&IP: %s port: %d\n&, m_strServerIP.c_str(), m_nServerPort);
if (Connect(m_cmdSocket, m_strServerIP, m_nServerPort) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
printf(&@@@@Response: %s&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::inputUserName(const std::string &userName)
std::string strCommandLine = parseCommand(FTP_COMMAND_USERNAME, userName);
m_strUserName = userN
if (Send(m_cmdSocket, strCommandLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
printf(&Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::inputPassWord(const std::string &password)
std::string strCmdLine = parseCommand(FTP_COMMAND_PASSWORD, password);
m_strPassWord =
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_bLogin =
m_strResponse = serverResponse(m_cmdSocket);
printf(&Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::quitServer(void)
std::string strCmdLine = parseCommand(FTP_COMMAND_QUIT, &&);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
printf(&Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
const std::string CFTPManager::PWD()
std::string strCmdLine = parseCommand(FTP_COMMAND_CURRENT_PATH, &&);
if (Send(m_cmdSocket, strCmdLine.c_str()) & 0)
return &&;
return serverResponse(m_cmdSocket);
FTP_API CFTPManager::setTransferMode(type mode)
std::string strCmdL
switch (mode)
case binary:
strCmdLine = parseCommand(FTP_COMMAND_TYPE_MODE, &I&);
case ascii:
strCmdLine = parseCommand(FTP_COMMAND_TYPE_MODE, &A&);
if (Send(m_cmdSocket, strCmdLine.c_str()) & 0)
assert(false);
m_strResponse
= serverResponse(m_cmdSocket);
printf(&@@@@Response: %s&, m_strResponse.c_str());
return parseResponse(m_strResponse);
const std::string CFTPManager::Pasv()
std::string strCmdLine = parseCommand(FTP_COMMAND_PSAV_MODE, &&);
if (Send(m_cmdSocket, strCmdLine.c_str()) & 0)
return &&;
m_strResponse = serverResponse(m_cmdSocket);
return m_strR
const std::string CFTPManager::Dir(const std::string &path)
int dataSocket = socket(AF_INET, SOCK_STREAM, 0);
if (createDataLink(dataSocket) & 0)
return &&;
// 数据连接成功
std::string strCmdLine = parseCommand(FTP_COMMAND_DIR, path);
if (Send(m_cmdSocket, strCmdLine) & 0)
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
close(dataSocket);
return &&;
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
m_strResponse = serverResponse(dataSocket);
trace(&@@@@Response: \n%s\n&, m_strResponse.c_str());
close(dataSocket);
return m_strR
FTP_API CFTPManager::CD(const std::string &path)
assert(m_cmdSocket != INVALID_SOCKET);
std::string strCmdLine = parseCommand(FTP_COMMAND_CHANGE_DIRECTORY, path);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
trace(&@@@@Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::DeleteFile(const std::string &strRemoteFile)
assert(m_cmdSocket != INVALID_SOCKET);
std::string strCmdLine = parseCommand(FTP_COMMAND_DELETE_FILE, strRemoteFile);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
printf(&@@@@Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::DeleteDirectory(const std::string &strRemoteDir)
assert(m_cmdSocket != INVALID_SOCKET);
std::string strCmdLine = parseCommand(FTP_COMMAND_DELETE_DIRECTORY, strRemoteDir);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
trace(&@@@@Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::CreateDirectory(const std::string &strRemoteDir)
assert(m_cmdSocket != INVALID_SOCKET);
std::string strCmdLine = parseCommand(FTP_COMMAND_CREATE_DIRECTORY, strRemoteDir);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
trace(&@@@@Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
FTP_API CFTPManager::Rename(const std::string &strRemoteFile, const std::string &strNewFile)
assert(m_cmdSocket != INVALID_SOCKET);
std::string strCmdLine = parseCommand(FTP_COMMAND_RENAME_BEGIN, strRemoteFile);
Send(m_cmdSocket, strCmdLine);
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
Send(m_cmdSocket, parseCommand(FTP_COMMAND_RENAME_END, strNewFile));
m_strResponse = serverResponse(m_cmdSocket);
trace(&@@@@Response: %s\n&, m_strResponse.c_str());
return parseResponse(m_strResponse);
long CFTPManager::getFileLength(const std::string &strRemoteFile)
assert(m_cmdSocket != INVALID_SOCKET);
std::string strCmdLine = parseCommand(FTP_COMMAND_FILE_SIZE, strRemoteFile);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
m_strResponse = serverResponse(m_cmdSocket);
trace(&@@@@Response: %s\n&, m_strResponse.c_str());
std::string strData = m_strResponse.substr(0, 3);
unsigned long val = atol(strData.c_str());
if (val == 213)
strData = m_strResponse.substr(4);
trace(&strData: %s\n&, strData.c_str());
val = atol(strData.c_str());
return -1;
void CFTPManager::Close(int sock)
shutdown(sock, SHUT_RDWR);
close(sock);
sock = INVALID_SOCKET;
FTP_API CFTPManager::Get(const std::string &strRemoteFile, const std::string &strLocalFile)
return downLoad(strRemoteFile, strLocalFile);
FTP_API CFTPManager::Put(const std::string &strRemoteFile, const std::string &strLocalFile)
std::string strCmdL
const unsigned long dataLen = FTP_DEFAULT_BUFFER;
char strBuf[dataLen] = {0};
unsigned long nSize = getFileLength(strRemoteFile);
unsigned long nLen = 0;
struct stat sB
assert(stat(strLocalFile.c_str(), &sBuf) == 0);
trace(&size: %d\n&, sBuf.st_size);
FILE *pFile = fopen(strLocalFile.c_str(), &rb&);
// 以只读方式打开
且文件必须存在
assert(pFile != NULL);
int data_fd = socket(AF_INET, SOCK_STREAM, 0);
assert(data_fd != -1);
if (createDataLink(data_fd) & 0)
return -1;
if (nSize == -1)
strCmdLine = parseCommand(FTP_COMMAND_UPLOAD_FILE, strRemoteFile);
strCmdLine = parseCommand(FTP_COMMAND_APPEND_FILE, strRemoteFile);
if (Send(m_cmdSocket, strCmdLine) & 0)
Close(data_fd);
return -1;
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
fseek(pFile, nSize, SEEK_SET);
while (!feof(pFile))
nLen = fread(strBuf, 1, dataLen, pFile);
if (nLen & 0)
if (Send(data_fd, strBuf) & 0)
Close(data_fd);
return -1;
trace(&@@@@Response: %s\n&, serverResponse(data_fd).c_str());
Close(data_fd);
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
fclose(pFile);
const std::string CFTPManager::parseCommand(const unsigned int command, const std::string &strParam)
if (command & FTP_COMMAND_BASE || command & FTP_COMMAND_END)
return &&;
std::string strCommandL
m_nCurrentCommand =
m_commandStr.clear();
switch (command)
case FTP_COMMAND_USERNAME:
strCommandLine = &USER &;
case FTP_COMMAND_PASSWORD:
strCommandLine = &PASS &;
case FTP_COMMAND_QUIT:
strCommandLine = &QUIT &;
case FTP_COMMAND_CURRENT_PATH:
strCommandLine = &PWD &;
case FTP_COMMAND_TYPE_MODE:
strCommandLine = &TYPE &;
case FTP_COMMAND_PSAV_MODE:
strCommandLine = &PASV &;
case FTP_COMMAND_DIR:
strCommandLine = &LIST &;
case FTP_COMMAND_CHANGE_DIRECTORY:
strCommandLine = &CWD &;
case FTP_COMMAND_DELETE_FILE:
strCommandLine = &DELE &;
case FTP_COMMAND_DELETE_DIRECTORY:
strCommandLine = &RMD &;
case FTP_COMMAND_CREATE_DIRECTORY:
strCommandLine = &MKD &;
case FTP_COMMAND_RENAME_BEGIN:
strCommandLine = &RNFR &;
case FTP_COMMAND_RENAME_END:
strCommandLine = &RNTO &;
case FTP_COMMAND_FILE_SIZE:
strCommandLine = &SIZE &;
case FTP_COMMAND_DOWNLOAD_FILE:
strCommandLine = &RETR &;
case FTP_COMMAND_DOWNLOAD_POS:
strCommandLine = &REST &;
case FTP_COMMAND_UPLOAD_FILE:
strCommandLine = &STOR &;
case FTP_COMMAND_APPEND_FILE:
strCommandLine = &APPE &;
strCommandLine += strP
strCommandLine += &\r\n&;
m_commandStr = strCommandL
trace(&parseCommand: %s\n&, m_commandStr.c_str());
return m_commandS
FTP_API CFTPManager::Connect(int socketfd, const std::string &serverIP, unsigned int nPort)
if (socketfd == INVALID_SOCKET)
return -1;
unsigned int argp = 1;
int error = -1;
int len = sizeof(int);
struct sockaddr_
bool ret =
ioctl(socketfd, FIONBIO, &argp);
//设置为非阻塞模式
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(nPort);
addr.sin_addr.s_addr = inet_addr(serverIP.c_str());
bzero(&(addr.sin_zero), 8);
trace(&Address: %s %d\n&, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
if (connect(socketfd, (struct sockaddr*)&addr, sizeof(struct sockaddr)) == -1)
//若直接返回 则说明正在进行TCP三次握手
stime.tv_sec = 20;
//设置为1秒超时
stime.tv_usec = 0;
FD_ZERO(&set);
FD_SET(socketfd, &set);
if (select(socketfd + 1, NULL, &set, NULL, &stime) & 0)
///在这边等待 阻塞 返回可以读的描述符 或者超时返回0
或者出错返回-1
getsockopt(socketfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t*)&len);
if (error == 0)
{ trace(&Connect Immediately!!!\n&);
ioctl(socketfd, FIONBIO, &argp);
close(socketfd);
fprintf(stderr, &cannot connect server!!\n&);
return -1;
//fprintf(stdout, &Connect!!!\n&);
const std::string CFTPManager::serverResponse(int sockfd)
if (sockfd == INVALID_SOCKET)
return &&;
int nRet = -1;
char buf[MAX_PATH] = {0};
m_strResponse.clear();
while ((nRet = getData(sockfd, buf, MAX_PATH)) & 0)
buf[MAX_PATH - 1] = '\0';
m_strResponse +=
return m_strR
FTP_API CFTPManager::getData(int fd, char *strBuf, unsigned long length)
assert(strBuf != NULL);
if (fd == INVALID_SOCKET)
return -1;
memset(strBuf, 0, length);
stime.tv_sec = 1;
stime.tv_usec = 0;
FD_ZERO( &readfd );
FD_SET(fd, &readfd );
if (select(fd + 1, &readfd, 0, 0, &stime) & 0)
if ((nLen = recv(fd, strBuf, length, 0)) & 0)
return -2;
FTP_API CFTPManager::Send(int fd, const std::string &cmd)
if (fd == INVALID_SOCKET)
return -1;
return Send(fd, cmd.c_str(), cmd.length());
FTP_API CFTPManager::Send(int fd, const char *cmd, const size_t len)
if((FTP_COMMAND_USERNAME != m_nCurrentCommand)
&&(FTP_COMMAND_PASSWORD != m_nCurrentCommand)
&&(!m_bLogin))
return -1;
timeout.tv_sec
timeout.tv_usec = 0;
FD_ZERO(&writefd);
FD_SET(fd, &writefd);
if(select(fd + 1, 0, &writefd , 0 , &timeout) & 0)
size_t nlen
int nSendLen = 0;
while (nlen &0)
nSendLen = send(fd, cmd , (int)nlen , 0);
if(nSendLen == -1)
return -2;
nlen = nlen - nSendL
return -1;
FTP_API CFTPManager::createDataLink(int data_fd)
assert(data_fd != INVALID_SOCKET);
std::string strD
unsigned long nPort = 0 ;
std::string strServerI
std::list&std::string& strA
std::string parseStr = Pasv();
if (parseStr.size() &= 0)
return -1;
//trace(&parseInfo: %s\n&, parseStr.c_str());
size_t nBegin = parseStr.find_first_of(&(&);
size_t nEnd
= parseStr.find_first_of(&)&);
= parseStr.substr(nBegin + 1, nEnd - nBegin - 1);
//trace(&ParseAfter: %s\n&, strData.c_str());
if( SplitString( strData , strArray , &,& ) &0)
return -1;
if( ParseString( strArray , nPort , strServerIp) & 0)
return -1;
//trace(&nPort: %ld IP: %s\n&, nPort, strServerIp.c_str());
if (Connect(data_fd, strServerIp, nPort) & 0)
return -1;
FTP_API CFTPManager::ParseString(std::list&std::string& strArray, unsigned long & nPort ,std::string & strServerIp)
if (strArray.size() & 6 )
return -1 ;
std::list&std::string&::
citor = strArray.begin();
strServerIp = *
strServerIp += &.&;
strServerIp += *
strServerIp += &.&;
citor ++ ;
strServerIp += *
strServerIp += &.&;
citor ++ ;
strServerIp += *
citor = strArray.end();
nPort = atol( (*citor).c_str());
nPort += atol( (*(citor)).c_str()) * 256 ;
return 0 ;
FILE *CFTPManager::createLocalFile(const std::string &strLocalFile)
return fopen(strLocalFile.c_str(), &w+b&);
FTP_API CFTPManager::downLoad(const std::string &strRemoteFile, const std::string &strLocalFile, const int pos, const unsigned int length)
assert(length &= 0);
FILE *file = NULL;
unsigned long nDataLen = FTP_DEFAULT_BUFFER;
char strPos[MAX_PATH]
int data_fd = socket(AF_INET, SOCK_STREAM, 0);
assert(data_fd != -1);
if ((length != 0) && (length & nDataLen))
nDataLen =
char *dataBuf = new char[nDataLen];
assert(dataBuf != NULL);
sprintf(strPos, &%d&, pos);
if (createDataLink(data_fd) & 0)
trace(&@@@@ Create Data Link error!!!\n&);
return -1;
std::string strCmdLine = parseCommand(FTP_COMMAND_DOWNLOAD_POS, strPos);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
strCmdLine = parseCommand(FTP_COMMAND_DOWNLOAD_FILE, strRemoteFile);
if (Send(m_cmdSocket, strCmdLine) & 0)
return -1;
trace(&@@@@Response: %s\n&, serverResponse(m_cmdSocket).c_str());
file = createLocalFile(std::string(FTP_DEFAULT_PATH + strLocalFile));
assert(file != NULL);
int len = 0;
int nReceiveLen = 0;
while ((len = getData(data_fd, dataBuf, nDataLen)) & 0)
nReceiveLen +=
int num = fwrite(dataBuf, 1, len, file);
memset(dataBuf, 0, sizeof(dataBuf));
//trace(&%s&, dataBuf);
trace(&Num:%d\n&, num);
if (nReceiveLen == length && length != 0)
if ((nReceiveLen + nDataLen) & length
&& length != 0)
delete []dataB
nDataLen = length - nReceiveL
dataBuf = new char[nDataLen];
Close(data_fd);
fclose(file);
delete []dataB
FTP_API CFTPManager::parseResponse(const std::string &str)
assert(!str.empty());
std::string strData = str.substr(0, 3);
unsigned int val = atoi(strData.c_str());
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:66672次
积分:3101
积分:3101
排名:第11867名
原创:173篇
转载:265篇
(22)(75)(60)(40)(42)(1)(7)(30)(147)(6)(8)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'CURL常用命令 - 张贺 - 博客园
posts - 122, comments - 17, trackbacks - 0, articles - 12
原文地址:
下载单个文件,默认将输出打印到标准输出中(STDOUT)中
curl http://www.centos.org
通过-o/-O选项保存下载的文件到指定的文件中:-o:将文件保存为命令行中指定的文件名的文件中-O:使用URL中默认的文件名保存文件到本地
1 # 将文件下载到本地并命名为mygettext.html
2 curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
4 # 将文件保存到本地并命名为gettext.html
5 curl -O http://www.gnu.org/software/gettext/manual/gettext.html
同样可以使用转向字符"&"对输出进行转向输出
同时获取多个文件
1 curl -O URL1 -O URL2
若同时从同一站点下载多个文件时,curl会尝试重用链接(connection)。
通过-L选项进行重定向默认情况下CURL不会发送HTTP Location headers(重定向).当一个被请求页面移动到另一个站点时,会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上。例如:访问时,会自动将地址重定向到.hk上。
1 curl http://
&meta http-equiv="content-type" content="text/charset=utf-8"&
&TITLE&302 Moved&/TITLE&
&H1&302 Moved&/H1&
The document has moved
&A HREF=".hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=.hk/&ust=7135usg=AFQjCNF3o7umf3jyJpNDPuF7KTibavE4aA"&here&/A&.
11 &/BODY&
12 &/HTML&
上述输出说明所请求的档案被转移到了.hk。
这是可以通过使用-L选项进行强制重定向
1 # 让curl使用地址重定向,此时会查询.hk站点
2 curl -L http://
通过使用-C选项可对大文件使用断点续传功能,如:
1 # 当文件在下载完成之前结束该进程
2 $ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
3 ##############
5 # 通过添加-C选项继续对该文件进行下载,已经下载过的文件不会被重新下载
6 curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
7 ###############
对CURL使用网络限速通过--limit-rate选项对CURL的最大网络使用进行限制
1 # 下载速度最大不会超过1000B/second
3 curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
下载指定时间内修改过的文件
当下载一个文件时,可对该文件的最后修改日期进行判断,如果该文件在指定日期内修改过,就进行下载,否则不下载。该功能可通过使用-z选项来实现:
1 # 若yy.html文件在2011/12/21之后有过更新才会进行下载
2 curl -z 21-Dec-11 http:///yy.html
在访问需要授权的页面时,可通过-u选项提供用户名和密码进行授权
1 curl -u username:password URL
3 # 通常的做法是在命令行只输入用户名,之后会提示输入密码,这样可以保证在查看历史记录时不会将密码泄露
4 curl -u username URL
从FTP服务器下载文件
CURL同样支持FTP下载,若在url中指定的是某个文件路径而非具体的某个要下载的文件名,CURL则会列出该目录下的所有文件名而并非下载该目录下的所有文件
1 # 列出public_html下的所有文件夹和文件
2 curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
4 # 下载xss.php文件
5 curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
上传文件到FTP服务器
通过 -T 选项可将指定的本地文件上传到FTP服务器上
# 将myfile.txt文件上传到服务器
curl -u ftpuser:ftppass -T myfile.txt ftp://
# 同时上传多个文件
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://
# 从标准输入获取内容保存到服务器指定的文件中
curl -u ftpuser:ftppass -T - ftp:///myfile_1.txt
获取更多信息
通过使用 -v 和 -trace获取更多的链接信息
通过字典查询单词
1 # 查询bash单词的含义
2 curl dict://dict.org/d:bash
4 # 列出所有可用词典
5 curl dict://dict.org/show:db
7 # 在foldoc词典中查询bash单词的含义
8 curl dict://dict.org/d:bash:foldoc
为CURL设置代理
-x 选项可以为CURL添加代理功能
1 # 指定代理主机和端口
2 curl -x :3128 http://google.co.in
其他网站整理
保存与使用网站cookie信息
1 # 将网站的cookies信息保存到sugarcookies文件中
2 curl -D sugarcookies http://localhost/sugarcrm/index.php
4 # 使用上次保存的cookie信息
5 curl -b sugarcookies http://localhost/sugarcrm/index.php
传递请求数据
默认curl使用GET方式请求数据,这种方式下直接通过URL传递数据可以通过 --data/-d 方式指定使用POST方式传递数据
2 curl -u username https:///user?access_token=XXXXXXXXXX
5 curl -u username --data "param1=value1&param2=value" https://
7 # 也可以指定一个文件,将该文件中的内容当作数据传递给服务器端
8 curl --data @filename https:///authorizations
注:默认情况下,通过POST方式传递过去的数据中若有特殊字符,首先需要将特殊字符转义在传递给服务器端,如value值中包含有空格,则需要先将空格转换成%20,如:
1 curl -d "value%201" http://
在新版本的CURL中,提供了新的选项 --data-urlencode,通过该选项提供的参数会自动转义特殊字符。
1 curl --data-urlencode "value 1" http://
除了使用GET和POST协议外,还可以通过 -X 选项指定其它协议,如:
1 curl -I -X DELETE https://api.github.cim
1 curl --form "fileupload=@filename.txt" http://hostname/resource}

我要回帖

更多关于 ftp服务器端口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信