⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 command.cpp

📁 利用HyfaFax传真的传输协议(与FTP协议相似),编写发送传真到目的传真服务器的客户代码!
💻 CPP
字号:
#include "command.h"
#define FAX_DEFPORT 4559

#if !defined WIN32 
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h> 
#endif


tab Command::cmdtab[COMMANDCOUNT] = 
{
	{T_USER,	"USER %s\r\n",	{{"230",Success},{"331",Needpasswd},{"500",unRecogniz}} },
	{T_PASS,	"PASS %s\r\n",	{{"230",Success},{"530",SessionClose},{"500",unRecogniz}} },
	{T_TZONE,	"TZONE %s\r\n",	{{"200",Success}} },
	{T_MODE,	"MODE %s\r\n",	{{"200",Success},{"504",modeUnSupport}} },
	{T_TYPE,	"TYPE %s\r\n",	{{"200",Success},{"504",typeUnSupport}} },
	{T_PASV,	"PASV\r\n",		{{"227",Success},{"425",pasvErr}} },
	{T_STOT,	"STOT\r\n",		{{"150",Success},{"550",}} },
	{T_JNEW,	"JNEW %d\r\n",		{{"200",Success},{"503",jobUnCreate}} },
	{T_JPARM,	"JPARM %s\r\n",	{{"213",Success},{"200",Success},{"500",unRecogniz},{"502",unImplement}} },
	{T_JSUB,    "JSUBM %d\r\n",	{{"200",Success},{"504",unSubmit},{"460",submitfaild},{"450",Unknow}}},
	{T_JOB,     "JOB %s\r\n",   {{"200",Success},{"500",cantSetJob}}},
	{T_LIST,	"LIST %s\r\n",	{{"150",Success},{"",}}},
	{T_QUIT,    "QUIT\r\n",     {{"221",Success},{"",}}}
};


Command::Command()
{

	memset(szBuffer_,0,BUFFER_SIZE);

}


Command::~Command()
{

}

bool Command::initialize(string& szHost)
{
	if(SubmitFaxSession_.Initialize(PROTOCOL_TCP))
	{
		if(SubmitFaxSession_.Connect((char*)szHost.c_str(),FAX_DEFPORT))
		{
			
			SubmitFaxSession_.Recv(szBuffer_,BUFFER_SIZE);
			char szSuccess[] = "220";
			if(strncmp(szBuffer_,szSuccess,strlen(szSuccess)) != 0)
			{
				return false;
			}
	//		LOG(Log_Info,szBuffer_);
			printf(szBuffer_);
			printf("\n");
			memset(szBuffer_,0,BUFFER_SIZE);
		
			return true;
		}
	}
	return false;
}

void   Command::Release()
{

	command(T_QUIT,cmdtab[T_QUIT].cmd);
	SubmitFaxSession_.Close();
}

bool Command::login()
{
	char userName[64] = {0};
#ifdef WIN32
	strcpy(userName,"root");
#else
	struct passwd* pwd = NULL;
	const char* name = getenv("FAXUSER");
    if (name)
        pwd = getpwnam(name);
    else
        pwd = getpwuid(getuid());
    if (!pwd)
	{
       
        return false;
    }
    strcpy(userName , pwd->pw_name);
#endif

	Result nResult = command(T_USER,cmdtab[T_USER].cmd,userName);//
	if(nResult != Success)
	{
		return false;
	}
	
	return true;
		
}


const char* Command::cmdParam(const char *fmt ...)
{
	static char szParam[256] = {0};
	va_list ap;
    va_start(ap, fmt);
    VSNPRINTF(szParam,256,fmt,ap);
    va_end(ap);
	return  (const char*) szParam;
}
Result Command::command(Token cmd,const char* fmt ...)
{
	va_list ap;
    va_start(ap, fmt);
    Result r = vcommand(cmd,fmt, ap);
    va_end(ap);
    return (r);
	
}


Result Command::vcommand(Token cmd,const char* fmt, va_list ap)
{
	
	
	VSNPRINTF(szBuffer_,BUFFER_SIZE,fmt,ap);
//	LOG(Log_Info,szBuffer_);
	printf(szBuffer_);
	printf("\n");
	if(SubmitFaxSession_.Send(szBuffer_,strlen(szBuffer_)) > 0)
		{
		memset(szBuffer_,0,BUFFER_SIZE);
		int nRecvCount =  SubmitFaxSession_.Recv(szBuffer_,BUFFER_SIZE);
//		LOG(Log_Info,szBuffer_);
		printf(szBuffer_);
		printf("\n");
		switch(cmd)
		{
			
			
		case T_USER:
			{
				
				for(int i = 0; i < 3; i ++)
				{
					if(strncmp(szBuffer_,cmdtab[cmd].ResultList[i].szResult,strlen(cmdtab[cmd].ResultList[i].szResult)) == 0)
						return cmdtab[cmd].ResultList[i].Meaning;
					
				}
				
			}
			break;
		case T_JNEW:		
		case T_PASV:
		case T_PASS:
		case T_JOB:
		case T_TYPE:
		case T_MODE:
		case T_STOT:
		case T_LIST:
		case T_QUIT:
			{

				for(int i = 0; i < 2; i ++)
				{
					if(strncmp(szBuffer_,cmdtab[cmd].ResultList[i].szResult,strlen(cmdtab[cmd].ResultList[i].szResult)) == 0)
					{
						
						return cmdtab[cmd].ResultList[i].Meaning;
					}
					
				}
				
			}
			break;
			
		case T_TZONE:
			{

				if(strncmp(szBuffer_,cmdtab[cmd].ResultList[0].szResult,strlen(cmdtab[cmd].ResultList[0].szResult)) == 0)
					return cmdtab[cmd].ResultList[0].Meaning;
				return Unknow;
			}			
			break;
		case T_JPARM:
		case T_JSUB:
			{

				for(int i = 0; i < 4; i ++)
				{
					if(strncmp(szBuffer_,cmdtab[cmd].ResultList[i].szResult,strlen(cmdtab[cmd].ResultList[i].szResult)) == 0)
						return cmdtab[cmd].ResultList[i].Meaning;
					
				}
			}				
			
			break;
		}
		
		
	}
	
	return Unknow;
}


bool  Command::GetHostAndPort(const char* const pstr,char* szIP,int& nPort)
{

	
	char *pIP = strstr(pstr,"(");
	if(pIP != NULL)
	{
		pIP ++;	
		for(int i =0; i < 4 ;i ++)
		{
			char * szsearch = strstr(pIP,",");
			if(szsearch != NULL)
			{
				*szsearch = '\0';
				strcat(szIP,pIP);
				if(i != 3)
					strcat(szIP,".");
				pIP = szsearch;
				pIP ++;
			}
			else
			{
				return false;
			}
			
		}
		
		char *Head = pIP;
		char *szsearch = strstr(pIP,",");
		if(szsearch != NULL)
		{
			
			*szsearch = '\0';
			char *end = szsearch + 1;
			szsearch = strstr(szsearch + 1,")");
			if(szsearch != NULL)
			{
				*szsearch = '\0';
				nPort = (atoi(Head) << 8) + atoi(end);	
				
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	
		return true;
	}
	else
	{
		return false;
	}
	
}


bool Command::TransferComplete()
{
	memset(szBuffer_,0,BUFFER_SIZE);
	SubmitFaxSession_.Recv(szBuffer_,BUFFER_SIZE);
//	LOG(Log_Info,szBuffer_);
	printf(szBuffer_);
	printf("\n");
	const char cSuccess[] = "226";
	return strncmp(szBuffer_,cSuccess,strlen(cSuccess)) == 0;
				
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -