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

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

?? pop3.cpp

?? vc++網絡編程教程的源碼。可能對使用vc網絡編程的有用。
?? 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一区二区三区免费野_久草精品视频
26uuu亚洲婷婷狠狠天堂| 欧美男女性生活在线直播观看| 久久久午夜精品理论片中文字幕| 青青草国产成人av片免费| 日韩一级完整毛片| 国产成人综合精品三级| 久久久久国产精品厨房| 欧美aaa在线| 国产三级一区二区| 97久久久精品综合88久久| 亚洲男人的天堂网| 欧美色中文字幕| 国产一区二区久久| 一区视频在线播放| 69精品人人人人| 懂色av中文字幕一区二区三区| 亚洲欧美色一区| 91精品国产免费| 国产盗摄视频一区二区三区| 国产女同性恋一区二区| 高清不卡一二三区| 亚洲一区影音先锋| 日韩欧美国产综合一区 | 亚洲精品乱码久久久久久日本蜜臀| 一本久久a久久免费精品不卡| 日日夜夜免费精品| 国产清纯美女被跳蛋高潮一区二区久久w | 日本成人中文字幕在线视频| 国产片一区二区| 欧美日韩在线免费视频| 国产永久精品大片wwwapp| 亚洲愉拍自拍另类高清精品| 久久蜜桃av一区二区天堂| 欧美在线短视频| av高清久久久| 中文字幕欧美三区| 欧美一级二级三级乱码| 在线观看不卡一区| 国产1区2区3区精品美女| 亚洲小说欧美激情另类| 国产精品免费人成网站| 欧美成人伊人久久综合网| 99久久精品国产一区| 韩国欧美一区二区| 首页综合国产亚洲丝袜| 亚洲欧美色图小说| 欧美激情艳妇裸体舞| 精品国产三级电影在线观看| 91九色02白丝porn| 国产91精品一区二区| 久久精品久久综合| 亚洲一区二区三区激情| 国产精品欧美一区喷水| 久久久久久麻豆| 日韩一级二级三级| 欧美日韩亚洲综合在线 | 在线视频中文字幕一区二区| 成人综合在线网站| 国产揄拍国内精品对白| 日韩国产欧美在线播放| 亚洲福利电影网| 综合久久久久久| 国产亚洲欧美中文| 久久亚洲私人国产精品va媚药| 欧美喷水一区二区| 欧美亚洲免费在线一区| 色综合色狠狠天天综合色| 国产·精品毛片| 国产九色sp调教91| 精品亚洲国产成人av制服丝袜 | 欧美激情一区三区| 精品欧美久久久| 精品裸体舞一区二区三区| 日韩亚洲欧美综合| 欧美一区二区三区视频在线观看| 欧美日本一区二区| 欧美一区二区三区的| 欧美高清视频一二三区| 91精品国产综合久久精品app| 8x福利精品第一导航| 欧美精品精品一区| 欧美大片一区二区三区| 精品久久人人做人人爱| 久久久午夜电影| 久久久精品国产免大香伊| 国产欧美一区二区三区鸳鸯浴| 久久久不卡网国产精品一区| 中文一区在线播放| 亚洲视频你懂的| 麻豆成人av在线| 久久99久久精品| 国产乱码精品一区二区三区av | 大尺度一区二区| av成人免费在线| 欧美性色黄大片| 欧美一区午夜视频在线观看| 日韩视频不卡中文| 中文字幕第一区第二区| 亚洲美女精品一区| 午夜欧美电影在线观看| 久久99精品久久只有精品| 国产盗摄一区二区| 欧美偷拍一区二区| 日韩欧美亚洲国产另类| 亚洲国产精品av| 亚洲综合激情网| 九一九一国产精品| 9色porny自拍视频一区二区| 欧美日韩一区二区三区免费看| 精品国产乱码久久久久久久久| 国产精品视频麻豆| 亚洲高清免费观看| 国产 日韩 欧美大片| 欧美午夜电影在线播放| 欧美va亚洲va香蕉在线| 国产精品美女视频| 午夜影院在线观看欧美| 精品在线免费视频| 色久优优欧美色久优优| 日韩一区二区三区免费看| 国产精品天美传媒| 日日夜夜精品视频免费| 99精品桃花视频在线观看| 在线播放中文字幕一区| 国产欧美日韩视频在线观看| 亚洲国产一区在线观看| 国产精品一区二区三区乱码 | 久久99精品一区二区三区| 色婷婷综合五月| 国产欧美日韩在线观看| 日本91福利区| 色狠狠桃花综合| 国产欧美视频一区二区| 蜜臀久久99精品久久久久宅男| 91丨九色丨黑人外教| 久久精品一级爱片| 麻豆成人久久精品二区三区红 | 欧美在线一区二区| 国产欧美精品一区二区色综合| 日本中文一区二区三区| 在线观看视频一区二区| 精品国产精品一区二区夜夜嗨| 亚洲国产欧美日韩另类综合| 国产精品1区2区3区在线观看| 欧美一区欧美二区| 日韩毛片在线免费观看| 国产999精品久久| 精品国产乱码久久久久久影片| 亚洲成人自拍偷拍| 91污片在线观看| 国产精品素人视频| 国产一区二区三区四区五区入口| 666欧美在线视频| 午夜视频在线观看一区二区三区| 成人听书哪个软件好| 国产欧美一区二区在线| 国产激情视频一区二区在线观看| 911精品国产一区二区在线| 亚洲主播在线播放| 色婷婷国产精品久久包臀| 国产偷v国产偷v亚洲高清| 精品一区二区三区视频在线观看| 欧美伦理影视网| 亚洲色图清纯唯美| 91首页免费视频| 亚洲欧洲中文日韩久久av乱码| 成人av免费在线观看| 国产精品久久三区| 色综合色狠狠天天综合色| 亚洲精品国产无天堂网2021| 成人av免费在线播放| 亚洲欧美日韩国产中文在线| 91理论电影在线观看| 18成人在线视频| 色偷偷成人一区二区三区91| 一区二区三区在线视频免费| 91久久精品一区二区| 亚洲欧美日韩国产另类专区 | 老司机一区二区| 日韩无一区二区| 玖玖九九国产精品| 久久久噜噜噜久久中文字幕色伊伊| 精品一区二区三区免费| 成人午夜大片免费观看| 成人高清视频免费观看| 精品福利在线导航| 久久av老司机精品网站导航| 欧美一区二区在线观看| 精品写真视频在线观看| 国产亚洲精品bt天堂精选| 不卡视频在线看| 国产精品国模大尺度视频| 91黄色在线观看| 天天色 色综合| 久久久久88色偷偷免费| 91同城在线观看| 三级不卡在线观看| 精品国产一区二区三区忘忧草| 成人午夜av在线| 一区二区三区中文在线|