亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pop3.cpp

?? 《Visual C++網絡通信編程實用案例精選》配套源碼
?? CPP
字號:
// Pop3.cpp: implementation of the CPop3 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MailPost.h"
#include "Pop3.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPop3::CPop3()
{
	// 初始化變量
	m_sError = _T("");
	m_sock = INVALID_SOCKET;
	m_nMails = 0;
	m_nSize = 0;
	m_bList = FALSE;
	m_bState = FALSE;
	m_arSizes.RemoveAll();
	m_arHeaders.RemoveAll();
	m_bConnected = FALSE;
	m_dwTimeout = 2000;
}

CPop3::~CPop3()
{

}

BOOL CPop3::Connect(LPCTSTR strAddress, LPCTSTR strUser, LPCTSTR strPassword,UINT nPort)
{
	// 初始化本地套接字
	m_sock = socket(AF_INET, SOCK_STREAM, 0);
	if (m_sock == INVALID_SOCKET)
	{
		m_sError = _T("初始化套接字失敗");
		return FALSE;
	}

	// 初始化遠端套接字
	SOCKADDR_IN sockAddr;
	memset(&sockAddr,'\0',sizeof(sockAddr));
	sockAddr.sin_family = AF_INET;
	sockAddr.sin_port = htons((u_short)nPort);
	sockAddr.sin_addr.s_addr = inet_addr(strAddress);

	// 如果主機名不是IP地址,用gethostbyname獲得其IP地址
	if (sockAddr.sin_addr.s_addr == INADDR_NONE)
	{
		LPHOSTENT lphost;
		lphost = gethostbyname(strAddress);
		if (lphost)
			sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
		else
		{
			m_sError = _T("無法解析地址!"); 
			return FALSE;
		}
	}
	
	// 嘗試與服務器連接
	if (connect(m_sock,(SOCKADDR *)(&sockAddr),sizeof(sockAddr)) == SOCKET_ERROR)
	{
		m_sError = _T("無法與服務器建立連接!");
		return FALSE;
	}

	// 接收回應信息
	if (!GetResponse())
	{
		// 回應失敗
		m_sError = _T("無法收到回應信息或收到錯誤信息!");
		Disconnect();
		return FALSE;
	}

	// 發送用戶名
	CString strTemp;
	strTemp.Format("USER %s\r\n",strUser);
    if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
    {
		// 發送用戶名失敗
		m_sError = _T("發送用戶名失敗!");
		return FALSE;
    }

	// 接收回應信息
    if (!GetResponse())
    {
		// 接收回應信息失敗
		m_sError = _T("無法收到回應信息或收到無效信息!");
		Disconnect();
		return FALSE;
    } 

    // 發送密碼
	strTemp.Format("PASS %s\r\n",strPassword);
    if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
    {
		// 發送密碼失敗
		m_sError = _T("發送密碼失敗!");
		Disconnect();
		return FALSE;
    }

	// 接收回應信息
    if (!GetResponse())
    {
		// 接收回應信息失敗
		m_sError = _T("無法收到回應信息或收到無效信息!");
		Disconnect();
		return FALSE;
    } 

	m_bConnected = TRUE;
	return TRUE;
}

BOOL CPop3::GetResponse(void)
{
	TCHAR chArray[1188];
	if (!ReadResponse(chArray,1188,FALSE))
	{
		return FALSE;
	}
	m_sResponse = chArray;
	return TRUE;
}

BOOL CPop3::ReadResponse(TCHAR *pChar, UINT nSize, BOOL bDouble)
{
	CString strTemp;

	// 讀取回應信息
	BOOL bEnd = FALSE;
	UINT nReceived = 0;
	DWORD dwStart = ::GetTickCount();
	while (!bEnd)
	{
		// 嘗試時間到
		if ((::GetTickCount() - dwStart) >	m_dwTimeout)
		{
			pChar[nReceived] = '\0';
			m_sError = _T("超時");
			// 保存當前回應的消息
			m_sResponse = pChar;
			return FALSE;
		}

		// 看套接字是否可讀
		timeval timeout = {0, 0};
		fd_set fds;
		FD_ZERO(&fds);
		FD_SET(m_sock,&fds);
		int nStatus = select(0,&fds,NULL,NULL,&timeout);

		if (nStatus == SOCKET_ERROR)
		{
			// 套接字不可讀
			m_sError = _T("套接字不可達");
			return FALSE;
		}
		else if (!nStatus)
		{
			// 沒有接收到數據
			::Sleep(688);
			continue;
		}

		// 從套接字中接收數據
		::Sleep(288);
		nStatus = recv(m_sock,pChar + nReceived,nSize,0);
		if (nStatus == SOCKET_ERROR)
		{
			pChar[nReceived] = '\0';
			// 套接字錯誤
			m_sError = _T("未能從套接字中收到數據!");
			// 保存當前回應信息
			m_sResponse = pChar; 
			return FALSE; 
		}
		else if (nStatus)
		{
			// 重置計時器
			dwStart = ::GetTickCount();
			// 已收到的數據又增加了
			nReceived += nStatus;
		}

		// 將pChar設為字符串,并賦給CString型的變量
		pChar[nReceived] = '\0';
		strTemp = pChar;
								
		// 檢查是否收到了結束標志
		LPCTSTR lpszComp = bDouble ? "\r\n.\r\n" : "\r\n";
		bEnd = (strTemp.Find(lpszComp) != -1);
	}

	// 去掉結束標志
	nReceived -= bDouble ? 3 : 0;
	pChar[nReceived] = '\0';

	// 檢查回應信息是否有效
	strTemp = pChar;
	strTemp.MakeUpper();
	int nStart = strTemp.Find("+OK");
	if (nStart == -1)
	{
		// 收到無效信息
		m_sError = _T("回應信息無效");
		return FALSE;
	}
	// 提取有效信息
	strTemp = pChar;
	m_sResponse = strTemp.Right(strTemp.GetLength() - nStart - 3);
	
	return TRUE;
}

BOOL CPop3::Disconnect()
{
	BOOL bSuccess;
	
	// 如果還保持連接狀態則斷開
	if (m_bConnected)
	{
		CString strSend = "QUIT\r\n";
		// 發送斷開請求
		if (!this->Send((LPCTSTR)strSend,strSend.GetLength()))
		{
			AfxMessageBox(_T("發送斷開請求失敗"));
			return FALSE;
		}

		bSuccess = this->GetResponse();

		// 將有關的變量復位
	    m_bConnected = FALSE;
		m_bList = FALSE;
	    m_bState = FALSE;
		m_nMails = 0;
		m_nSize = 0;
		m_arHeaders.RemoveAll();
		m_arSizes.RemoveAll();

		// 關閉套接字
		closesocket(m_sock);
		m_sock = INVALID_SOCKET;
	}

	return bSuccess;
}

BOOL CPop3::Send(LPCTSTR lpszSend, UINT nLength)
{
	return send(m_sock,lpszSend,nLength,0) != SOCKET_ERROR;
}

BOOL CPop3::ReadState()
{
	// 獲得返回的狀態信息
	if (!GetResponse())
	{
		// 接收返回信息失敗
		m_sError = _T("接收返回信息失敗!");
		return FALSE;
	}

	// 看返回的信息是否有效
	m_sResponse.MakeUpper();
	UINT nEnd = 0;
	if (m_sResponse.Find("+OK") == -1)
	{
		// 收到無效的回應信息
		m_sError = _T("返回信息無效!");
		return FALSE;
	}
	else
	{ 
		// 分析郵件數和大小,首先分析數目
		return this->ParseNumAndSize(m_nMails,m_nSize,(LPCTSTR)m_sResponse,nEnd);
	}
}

UINT CPop3::GetMailCount() const
{
	return m_nMails;
}

BOOL CPop3::ParseNumAndSize(UINT &nNum, UINT &nSize,LPCTSTR lpszBuf,UINT &nEnd)
{
	BOOL bNum = TRUE;
	for (int i = nEnd,j = -1;lpszBuf[i];i++)
	{
		if (isdigit(lpszBuf[i]))
			j = (j == -1) ? i : j;
		else
		{	
			if (j == -1)
			{
				// 還未讀入數字
				continue;
			}

			// 分析完一個字段
			else if (bNum)
			{
				// 分析數目
				m_nMails = atoi(&lpszBuf[j]);
				nNum = m_nMails;
				bNum = FALSE;
				j = -1;
			}

			else
			{
				// 分析大小
				m_nSize = atoi(&lpszBuf[j]);
				nSize = m_nSize;
				nEnd = i;
				return TRUE;
			}
		}
	}
	nEnd = i;
	return FALSE;
}

BOOL CPop3::ReadList()
{
	UINT nBuf = m_nMails * 18 + 188;
	char *pBuf = new char[nBuf];
	if (!pBuf)
	{
		return FALSE;
	}
	if (!ReadResponse(pBuf,nBuf,TRUE))
	{
		return FALSE;
	}
	m_arSizes.RemoveAll();
	m_arSizes.SetSize(m_nMails);
	UINT nNum,nSize,nEnd = 0;
	while (ParseNumAndSize(nNum,nSize,m_sResponse,nEnd))
	{
		m_arSizes.SetAt(nNum - 1,nSize);
	}

	return TRUE;
}

DWORD CPop3::GetMsgSize(UINT nID) 
{
	BOOL bSuccess;
	if (!m_bList)
		bSuccess = this->List();
	if (!bSuccess)
		return 0;

	return m_arSizes.GetAt(nID);
}

BOOL CPop3::ListHeader()
{
	m_arHeaders.RemoveAll();
	m_arHeaders.SetSize(m_nMails);
	CString strTemp;
	for (UINT nMsg = 1;nMsg <= m_nMails;nMsg++)
	{
		strTemp.Format("TOP %d 0\r\n",nMsg);
		if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
		{
			m_sError = _T("發送TOP命令失敗!");
			return FALSE;
		}

		if (!GetResponse())
		{
			m_sError = _T("列舉郵件主題失敗!");
			return FALSE;
		}
		
		strTemp = m_sResponse;
		strTemp.MakeUpper();
		
		// 查找SUBJECT段
		UINT nStart = strTemp.Find("\r\nSUBJECT:");
		if (nStart == -1)
		{
			m_arHeaders.SetAt(nMsg - 1,_T(""));			
			return TRUE;
		}
		strTemp = m_sResponse.Right(m_sResponse.GetLength() - nStart - 10);
		nStart = strTemp.Find("\r\n");
		if (nStart != -1)
			strTemp = strTemp.Left(nStart);
		strTemp.TrimLeft();
		strTemp.TrimRight();
		m_arHeaders.SetAt(nMsg - 1,strTemp);
	}

	return TRUE;
}

BOOL CPop3::Delete(UINT nIndex)
{
	CString strSend;
	strSend.Format("DELE %d\r\n",nIndex);

	// 發送DELE命令
	if (!Send((LPCTSTR)strSend,strSend.GetLength()))
	{
		// 未能成功發送
		m_sError = _T("刪除郵件失敗!");
		return FALSE;
	}

	// 接收返回信息
	if (!GetResponse())
	{
		m_sError = _T("收到無效信息!");
		return FALSE;
	}
	
	// 上一次STAT和LIST命令得到的信息無效
	m_bState = FALSE;
	m_bList = FALSE;
	return TRUE;
}

BOOL CPop3::RetrieveMail(UINT nIndex,CString &strMsg)
{
	CString strSend;
	strSend.Format("RETR %d\r\n",nIndex);
	if (!Send((LPCTSTR)strSend,strSend.GetLength()))
	{
		m_sError = _T("收取郵件失敗!");
		return FALSE;
	}

	if (!GetResponse())
	{
		m_sError = _T("無法收到送回的郵件!");
		return FALSE;
	}

	// 以CONTENT-DISPOSITION: INLINE為起始標志
	strMsg = m_sResponse;
	strMsg.MakeUpper();
	int nStart = strMsg.Find("CONTENT-DISPOSITION: INLINE\r\n");
	strMsg = m_sResponse.Right(m_sResponse.GetLength() - nStart - 29);

	// 空行表示郵件正文
	nStart = strMsg.Find("\r\n\r\n");
	strMsg = strMsg.Right(strMsg.GetLength() - nStart - 4);
	// 空行表示郵件正文結束
	nStart = strMsg.Find("\r\n\r\n");
	if (nStart != -1)
		strMsg = strMsg.Left(nStart);
	return TRUE;
}

BOOL CPop3::List()
{
	CString strTemp = "LIST\r\n";
	if (m_bList)
		return TRUE;
	if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
	{
		// 發送失敗
		m_sError = _T("查詢郵箱狀態失敗!");
		Disconnect();
		return FALSE;
	}

	if (!ReadList())
	{
		// 接收回應信息失敗
		m_sError = _T("無法收到郵件狀態信息或收到無效信息!");
		Disconnect();
		return FALSE;
    }

	return TRUE;
}

BOOL CPop3::GetState()
{
	CString strTemp = "STAT\r\n";
	if (m_bState)
		return TRUE;
	if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
	{
		// 發送失敗
		m_sError = _T("查詢郵箱狀態失敗!");
		Disconnect();
		return FALSE;
	}

    if (!ReadState())
    {
		// 接收回應信息失敗
		m_sError = _T("無法收到郵箱狀態信息或收到無效信息!");
		Disconnect();
		return FALSE;
    }

	return TRUE;
}

LPCTSTR CPop3::GetErrorString()
{
	return (LPCTSTR)m_sError;
}

BOOL CPop3::Noop()
{
	CString strTemp = "NOOP\r\n";

	// 發送NOOP命令
	if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
	{
		// 發送失敗
		m_sError = _T("進行空操作失敗!");
		Disconnect();
		return FALSE;
	}

	// 接收回應信息
    if (!GetResponse())
    {
		// 接收回應信息失敗
		m_sError = _T("無法收到回應信息或收到無效信息!");
		Disconnect();
		return FALSE;
    }

	return TRUE;
}

LPCTSTR CPop3::GetMailHeader(UINT nIndex)
{
	return (LPCTSTR)m_arHeaders.GetAt(nIndex);
}


BOOL CPop3::Reset()
{
	CString strTemp = "RSET\r\n";

	// 發送RSET命令
	if (!Send((LPCTSTR)strTemp,strTemp.GetLength()))
	{
		m_sError = _T("發送RSET命令失敗!");
		return FALSE;
	}
	
	// 接收回應信息
	if (!GetResponse())
	{
		// 接收回應信息失敗
		m_sError = _T("回應失敗!");
		return FALSE;
	}

	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩激情在线观看| 免费看精品久久片| 国产亚洲欧美在线| 久久综合九色综合97_久久久| 欧美人牲a欧美精品| 欧美日韩精品欧美日韩精品一| 欧美专区亚洲专区| 欧美另类高清zo欧美| 欧美精品日韩一区| 精品免费视频.| 久久久久国产精品麻豆ai换脸 | 国产福利一区二区三区| 精品一区二区三区影院在线午夜| 免费观看久久久4p| 国产精品18久久久久久久久久久久| 久久精品理论片| 成人在线综合网站| 一本久久a久久免费精品不卡| 在线视频欧美精品| 欧美一区二区三区电影| 欧美一区二区三区免费视频| 精品国产一区二区三区久久影院 | 日本成人在线电影网| 蜜臂av日日欢夜夜爽一区| 久久99久久精品欧美| 国产成人在线视频网站| 91啪九色porn原创视频在线观看| 色欧美片视频在线观看 | 日韩不卡在线观看日韩不卡视频| 麻豆免费看一区二区三区| 国产不卡在线播放| 欧美撒尿777hd撒尿| www久久精品| 亚洲另类中文字| 毛片av一区二区| 97超碰欧美中文字幕| 欧美电视剧在线观看完整版| 国产精品入口麻豆原神| 青娱乐精品在线视频| 97久久精品人人做人人爽50路| 欧美人妖巨大在线| 国产精品国产三级国产普通话99| 日韩专区中文字幕一区二区| 成人动漫一区二区在线| 欧美一级欧美三级| 一区二区三区高清不卡| 国产一区美女在线| 欧美一区二视频| 亚洲国产精品久久艾草纯爱| 成人h精品动漫一区二区三区| 欧美挠脚心视频网站| 国产精品久久久久久久蜜臀| 另类欧美日韩国产在线| 91行情网站电视在线观看高清版| 久久这里只精品最新地址| 偷拍亚洲欧洲综合| 色综合天天综合网天天看片| 久久久久久久综合日本| 美女视频免费一区| 欧美一级夜夜爽| 亚洲国产视频一区| 色激情天天射综合网| 国产精品污www在线观看| 精东粉嫩av免费一区二区三区| 欧美日韩国产成人在线免费| 亚洲女人的天堂| 色狠狠色噜噜噜综合网| 国产精品少妇自拍| 成人午夜免费视频| 国产欧美日韩另类视频免费观看| 国产一区二区精品在线观看| 日韩免费一区二区| 久久精品国产久精国产爱| 日韩一区二区三| 蜜桃传媒麻豆第一区在线观看| 欧美群妇大交群中文字幕| 亚洲福利一二三区| 8x8x8国产精品| 日韩精品一级二级| 欧美一二三区在线| 国产曰批免费观看久久久| 久久色.com| 岛国精品一区二区| 国产精品成人免费在线| 91天堂素人约啪| 亚洲精品v日韩精品| 色av成人天堂桃色av| 亚洲综合男人的天堂| 欧美日韩激情一区二区| 免费成人av资源网| 国产欧美精品一区| 色婷婷精品大视频在线蜜桃视频| 亚洲一区在线视频| 91精品在线观看入口| 国产乱妇无码大片在线观看| 日本一区二区三区久久久久久久久不 | 亚洲精品一区在线观看| 国产成人8x视频一区二区| 亚洲另类一区二区| 日韩视频免费观看高清完整版在线观看 | 免费观看在线色综合| 国产亚洲欧美色| 欧美在线不卡一区| 久久www免费人成看片高清| 中文字幕乱码日本亚洲一区二区| 色综合久久88色综合天天免费| 香蕉成人啪国产精品视频综合网| 欧美精品一区二区三区一线天视频| 国产成人av福利| 亚洲电影激情视频网站| 久久久久国色av免费看影院| 91福利视频网站| 国产乱人伦偷精品视频不卡 | 亚洲欧洲日韩av| 欧美一区二区久久| 99久久精品国产观看| 国产在线一区二区| 亚洲制服欧美中文字幕中文字幕| 精品国产伦理网| 欧美日韩精品是欧美日韩精品| 大桥未久av一区二区三区中文| 日本va欧美va精品发布| 一区二区三区美女视频| 国产三级一区二区三区| 欧美一级高清片| 欧美日韩国产综合久久| 99免费精品在线| 国产毛片精品国产一区二区三区| 亚洲一线二线三线视频| 最新不卡av在线| 国产精品免费久久| 国产欧美一区二区在线观看| 日韩免费观看高清完整版| 欧美吻胸吃奶大尺度电影 | 欧美三级电影精品| 色哟哟国产精品| 成人动漫精品一区二区| 国产一区二区三区黄视频 | 成人黄色国产精品网站大全在线免费观看| 亚洲香肠在线观看| 亚洲欧美另类在线| 亚洲欧洲另类国产综合| 亚洲国产成人在线| 国产视频一区在线观看| 久久综合色婷婷| 久久综合国产精品| 久久久精品免费观看| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩一区和二区| 精品久久一区二区三区| 欧美成人精品3d动漫h| 欧美不卡视频一区| 精品国产欧美一区二区| 久久一日本道色综合| 久久亚洲精精品中文字幕早川悠里| 欧美成人一区二区三区片免费| 日韩欧美国产系列| 久久先锋影音av| 国产网红主播福利一区二区| 国产精品欧美精品| 亚洲精品高清在线| 丝袜美腿亚洲一区二区图片| 青娱乐精品在线视频| 国产麻豆一精品一av一免费| 成人黄色免费短视频| 色狠狠桃花综合| 777亚洲妇女| 久久伊人蜜桃av一区二区| 中文字幕一区二区三区在线不卡 | 成人免费的视频| 一本一本久久a久久精品综合麻豆| 色悠久久久久综合欧美99| 欧美日韩国产综合久久| 精品国产凹凸成av人导航| 国产免费观看久久| 亚洲电影在线播放| 极品美女销魂一区二区三区免费| 成人av小说网| 91精品国产麻豆国产自产在线| 欧美tickling网站挠脚心| 国产精品久久久久久亚洲伦 | 成人午夜视频免费看| 欧美性生活久久| 337p粉嫩大胆色噜噜噜噜亚洲 | 2023国产精品视频| 亚洲精品国产视频| 久久99精品国产麻豆不卡| 91日韩精品一区| 精品盗摄一区二区三区| 夜夜亚洲天天久久| 国产成人综合亚洲网站| 欧美亚日韩国产aⅴ精品中极品| 日韩久久久精品| 夜夜嗨av一区二区三区| 韩国一区二区在线观看| 欧美日韩免费观看一区二区三区 | 亚洲黄色片在线观看| 国产一区二区三区免费看| 欧美日韩色一区| 亚洲天堂av一区|