#include "StdAfx.h"
#include "Ftp.h"
#include "string.h"
#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>
#include <io.h>
int ftp_Wirtelog(char * buf, ...)
{
FILE * logfile;
va_list ap;
char fname[128]={0};
sprintf(fname, "%s%s", "", "./FtpTraceLog.log");
if ((logfile=fopen( fname,"a+"))==NULL){
return -1;
}
va_start(ap,buf);
vfprintf(logfile, buf, ap);
va_end(ap);
fprintf(logfile, "\n");
fflush(logfile);
fclose(logfile);
return 0;
}
/* 从网络中读数据 */
bool IoRead(SOCKET nSocket, char *lpBuf, int nBufLen, bool bFlag/*=false*/)
{
int nread;
int nleft = nBufLen;
nread = recv(nSocket, lpBuf, nleft, 0);
if (nread == SOCKET_ERROR) {
ftp_Wirtelog("socket recv error");
return false;
}else if (nread == 0){ // 网络中断时返回0
if(bFlag){
ftp_Wirtelog("socket recv interrup");
return FALSE;
}
}
/*
while (nleft > 0) {
nread = recv(nSocket, lpBuf, nleft, 0);
if (nread == SOCKET_ERROR) {
ftp_Wirtelog("socket recv error");
return false;
}else if (nread == 0){ // 网络中断时返回0
if(bFlag){
ftp_Wirtelog("socket recv interrup");
return false;
}
break;
}
nleft -= nread;
lpBuf += nread;
}*/
return true;
}
int IoReadData(SOCKET nSocket, char *strBuf, unsigned long length)
{
if (strBuf == NULL || nSocket == INVALID_SOCKET || nSocket == SOCKET_ERROR) {
return -1;
}
memset(strBuf, 0, length);
timeval stime;
int nLen;
stime.tv_sec = 1;
stime.tv_usec = 0;
fd_set readfd;
FD_ZERO( &readfd );
FD_SET(nSocket, &readfd );
if (select(nSocket + 1, &readfd, 0, 0, &stime) > 0) {
if ((nLen = recv(nSocket, strBuf, length, 0)) > 0) {
return nLen;
} else {
return -2;
}
}
return 0;
}
/* 向网络中写数据 */
bool IoWrite(SOCKET nSocket, char *lpBuf, int nBufLen)
{
int nwritten;
int nleft = nBufLen;
if (nSocket == INVALID_SOCKET || nSocket == SOCKET_ERROR) {
ftp_Wirtelog("wirte socket is invalid");
return false;
}
while (nleft > 0) {
nwritten = send(nSocket, lpBuf, nleft, 0);
if (nwritten == SOCKET_ERROR) {
ftp_Wirtelog("socket send error");
return false;
}
nleft -= nwritten;
lpBuf += nwritten;
}
return true;
}
/* 向网络中写数据 */
bool IoWriteData(SOCKET nSocket, char *lpBuf, int nBufLen)
{
int nwritten;
int nleft = nBufLen;
if (nSocket == INVALID_SOCKET || nSocket == SOCKET_ERROR) {
ftp_Wirtelog("wirte socket is invalid");
return false;
}
timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
fd_set writefd;
FD_ZERO(&writefd);
FD_SET(nSocket, &writefd);
if(select(nSocket + 1, 0, &writefd , 0 , &timeout) > 0)
{
size_t nlen = nBufLen;
int nSendLen = 0;
while (nlen >0)
{
nSendLen = send(nSocket, lpBuf , (int)nlen , 0);
if(nSendLen == -1)
return false;
nlen = nlen - nSendLen;
lpBuf += nSendLen;
}
return true;
}
return false;
}
/* 连接到主机,创建socket连接 */
SOCKET IoConnect(char *lpszHostAddress, unsigned int nHostPort)
{
SOCKET nSocket = SOCKET_ERROR;
struct linger m_Linger;
struct sockaddr_in m_Sin;
nSocket = socket(AF_INET, SOCK_STREAM, 0); // 创建socket套接字 SOCK_STREAM 即TCP
if(nSocket == SOCKET_ERROR){
ftp_Wirtelog( "Unable to create the socket." );
return SOCKET_ERROR;
}
/*
m_Linger.l_onoff = 1;
m_Linger.l_linger = 1; // 设置连接时间
setsockopt(nSocket, SOL_SOCKET, SO_LINGER, (char *)&m_Linger, sizeof(struct linger)); // 设定 Socket 的状态
setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR,(char *)0, 0);
*/
int NameLen = sizeof(m_Sin);
memset(&m_Sin, 0, NameLen); // 将sockaddr结构Sin内容清零
m_Sin.sin_family = AF_INET;
m_Sin.sin_addr.s_addr = inet_addr(lpszHostAddress);
m_Sin.sin_port = htons((u_short)nHostPort);
if (connect(nSocket, (struct sockaddr *)&m_Sin, NameLen) == SOCKET_ERROR) { // 连接服务器
ftp_Wirtelog("Unable to connect to server");
closesocket(nSocket);
return SOCKET_ERROR;
}
return nSocket;
}
/* 断开网络连接 */
bool IoDisConnect(SOCKET nSocket)
{
closesocket(nSocket);
return true;
}
/* 初始化ftp句柄 */
FTP_HANDEL ftp_initHandel()
{
FTP_HANDEL pFtp = NULL;
pFtp = (FTP_HANDEL)malloc(sizeof(FTP_HANDEL_STRU));
if(pFtp){
memset(pFtp, 0, sizeof(FTP_HANDEL_STRU));
pFtp->bLogin = false;
pFtp->nResponseCode = FTP_LOCAL_ERRER;
pFtp->nFtpMode = FTP_MODE_PORT; // FTP_MODE_PASSIVE; // 默认为PASV模式 FTP_MODE_PORT; //
pFtp->nSocket = SOCKET_ERROR; // SOCKET命令套接字
pFtp->nPortSocket = SOCKET_ERROR; // 数据连接监听套接字 PORT模式使用
pFtp->nDataSocket = SOCKET_ERROR;
return pFtp;
}
return NULL;
}
/* 释放ftp句柄 */
void ftp_freeHandel(FTP_HANDEL pFtp)
{
if(pFtp) {
free(pFtp);
}
pFtp = NULL;
}
/**
* 向ftp服务器发送命令请求
*/
bool ftp_sendCmd(FTP_HANDEL pFtp)
{
if(pFtp == NULL || pFtp->nSocket == SOCKET_ERROR){
return false;
}
// 未登录,不允许发送
if((FTP_COMMAND_USERNAME != pFtp->nCurrentCommand)
&&(FTP_COMMAND_PASSWORD != pFtp->nCurrentCommand)
&&(!pFtp->bLogin))
{
return false;
}
ftp_Wirtelog("ftp_sendCmd:{%s}\n", pFtp->commandStr);
return IoWrite(pFtp->nSocket, pFtp->commandStr, strlen(pFtp->commandStr));
}
/**
* 获取ftp服务器命令应答
*/
bool ftp_recvCmdResponse(FTP_HANDEL pFtp)
{
int nRet = -1;
char buf[MAX_PATH] = {0};
if (pFtp == NULL || pFtp->nSocket == INVALID_SOCKET || pFtp->nSocket == SOCKET_ERROR)
{
return false;
}
strcpy(pFtp->strResponse, "");
while ((nRet = IoReadData(pFtp->nSocket, buf, MAX_PATH)) > 0)
{
buf[MAX_PATH - 1] = '\0';
strcat(pFtp->strResponse, buf);
}
ftp_Wirtelog("ftp_recvCmdResponse:{%s}\n", pFtp->strResponse);
return true;
}
/**
* 解析ftp服务器应答码
*/
bool ftp_parseCmdResponse(FTP_HANDEL pFtp)
{
char strData[4];
unsigned int val;
if(pFtp == NULL || pFtp->strResponse == NULL){
pFtp->nResponseCode = FTP_LOCAL_ERRER;
return false;
}
strncpy(strData, pFtp->strResponse, 3);
strData[3]='\0';
pFtp->nResponseCode = atoi(strData);
return true;
}
/**
* 向ftp服务器发送数据
*/
bool ftp_sendData(FTP_HANDEL pFtp, char *lpBuf, int nBufLen)
{
if(pFtp == NULL || pFtp->nDataSocket == SOCKET_ERROR){
return false;
}
return IoWrite(pFtp->nDataSocket, lpBuf, nBufLen);
}
/**
* 获取数据
*/
bool ftp_recvDataResponse(FTP_HANDEL pFtp)
{
int nRet = -1;
char buf[MAX_PATH] = {0};
if (pFtp == NULL || pFtp->nDataSocket == INVALID_SOCKET || pFtp->nDataSocket == SOCKET_ERROR)
{
return false;
}
strcpy(pFtp->strResponseData, "");
while ((nRet = IoReadData(pFtp->nDataSocket, buf, MAX_PATH)) > 0)
{
buf[MAX_PATH - 1] = '\0';
strcat(pFtp->strResponseData, buf);
}
//ftp_Wirtelog("ftp_recvDataResponse:{%s}\n", pFtp->strResponseData);
ftp_Wirtelog("ftp_recvDataResponse:{%s}\n", pFtp->strResponseData);
return true;
}
/**
* 拼装ftp命令
*/
bool ftp_parseCommand(FTP_HANDEL pFtp, const unsigned int command, char * strParam)
{
if (pFtp == NULL || command < FTP_COMMAND_BASE || command > FTP_COMMAND_END)
{
return false;
}
pFtp->nCurrentCommand = command;
strcpy(pFtp->commandStr, "");
switch (command)
{
case FTP_COMMAND_USERNAME:
strcpy(pFtp->commandStr, "USER ");
break;
case FTP_COMMAND_PASSWORD:
strcpy(pFtp->commandStr, "PASS ");
break;
case FTP_COMMAND_QUIT:
strcpy(pFtp->commandStr, "QUIT ");
break;
case FTP_COMMAND_CURRENT_PATH:
strcpy(pFtp->commandStr, "PWD ");
break;
case FTP_COMMAND_TYPE_MODE:
strcpy(pFtp->commandStr, "TYPE ");
break;
case FTP_COMMAND_PSAV_MODE:
strcpy(pFtp->commandStr, "PASV ");
break;
case FTP_COMMAND_PORT_MODE:
strcpy(pFtp->commandStr, "PORT ");
break;
case FTP_C
ftp.zip_FTP上传下载 PORT PASV
版权申诉
55 浏览量
2022-09-23
21:05:04
上传
评论
收藏 7KB ZIP 举报
御道御小黑
- 粉丝: 58
- 资源: 1万+
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈