FTP异步模型测试网络状态
来源:互联网 发布:spring中面向切面编程 编辑:程序博客网 时间:2024/06/05 16:26
开启FTP测试线程:
1、线程声明:
static DWORD WINAPI FtpCheckThread(LPVOID lpParam);
2、线程开启:
CloseHandle(CreateThread( NULL,0,FtpCheckThread,this,0,NULL));
3、线程实现:
InternetOpen最后一个参数设置为异步模型。
DWORD WINAPI CMainFrame::FtpCheckThread(LPVOID lpParam){CMainFrame* pThis = (CMainFrame*)lpParam;CString strIp,strPort,strUser,strPassword;BOOL bSuccess = FALSE;HINTERNET hInternet = NULL;HINTERNET hFtp = NULL;NETINFO* pNetInfo = new NETINFO;if (pNetInfo != NULL){pNetInfo->m_hEvent = CreateEvent(NULL,TRUE, //手动FALSE, //初始无信号NULL);pNetInfo->m_bSuccess = FALSE;pNetInfo->m_hHandle = NULL;}pThis->m_DlgBar.GetDlgItemText(IDC_ED_IP,strIp);pThis->m_DlgBar.GetDlgItemText(IDC_ED_PORT,strPort);pThis->m_DlgBar.GetDlgItemText(IDC_ED_USER,strUser);pThis->m_DlgBar.GetDlgItemText(IDC_ED_PASSWORD,strPassword);while(TRUE){if(hInternet != NULL){InternetCloseHandle(hInternet);Sleep(200);hInternet = NULL;}hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_ASYNC);if (hInternet != NULL){InternetSetStatusCallback(hInternet,InternetStatusCallback);//设置回调函数if(hFtp != NULL){InternetCloseHandle(hFtp);Sleep(500);hFtp = NULL;}TCHAR* pWideChar = strPort.GetBuffer(strPort.GetLength());char* pChar = WideCharToAnsi(pWideChar);strPort.ReleaseBuffer();hFtp = InternetConnect(hInternet,strIp,atoi(pChar),strUser,strPassword,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,(DWORD_PTR)pNetInfo);if (hFtp && GetLastError() != ERROR_IO_PENDING){//pThis->MessageBox(_T("第一次连接就成功了!"));gstrNetWorkMsg = _T("网络连接成功!");::PostMessage(pThis->m_hWnd,WM_NETSTATEMSG,0,0);}else{if (WaitForSingleObject(pNetInfo->m_hEvent,10000) == WAIT_OBJECT_0){ResetEvent(pNetInfo->m_hEvent);hFtp = pNetInfo->m_hHandle;pNetInfo->m_hHandle = NULL;}if (hFtp == NULL){//网络连接失败,正尝试重新连接gstrNetWorkMsg = _T("网络连接失败,正尝试重新连接...");::PostMessage(pThis->m_hWnd,WM_NETSTATEMSG,0,0);} else{//网络连接成功。。。gstrNetWorkMsg = _T("网络连接成功!");::PostMessage(pThis->m_hWnd,WM_NETSTATEMSG,0,0);Sleep(1000);bSuccess = FtpCommadCheck(hFtp,pNetInfo);if (bSuccess){//NetWork OkgstrNetWorkMsg = _T("NetWork Ok!");::PostMessage(pThis->m_hWnd,WM_NETSTATEMSG,0,0);} else{//NetWork ErrorgstrNetWorkMsg = _T("NetWork Error!");::PostMessage(pThis->m_hWnd,WM_NETSTATEMSG,0,0);}}Sleep(1000);}delete[] pChar;//......}else{Sleep(1000);}Sleep(10000);}return 1;}
其中:FtpCheckThread()函数中涉及到的几个函数的实现如下:
1)回调函数的声明和实现:
void CALLBACK InternetStatusCallback(HINTERNET hInternet,DWORD_PTR dwContext,DWORD dwInternetStatus,LPVOID lpvStatusInformation,DWORD dwStatusInformationLength);
void CALLBACK InternetStatusCallback(HINTERNET hInternet,DWORD_PTR dwContext,DWORD dwInternetStatus,LPVOID lpvStatusInformation,DWORD dwStatusInformationLength){if (dwInternetStatus == INTERNET_STATUS_REQUEST_COMPLETE){INTERNET_ASYNC_RESULT *Result = (INTERNET_ASYNC_RESULT*)lpvStatusInformation;if(Result->dwError == ERROR_SUCCESS){((NETINFO*)dwContext)->m_hHandle = (HINTERNET)Result->dwResult;((NETINFO*)dwContext)->m_bSuccess = (BOOL)Result->dwResult;SetEvent(((NETINFO*)dwContext)->m_hEvent);}}}
2)WideCharToAnsi的实现:
char *WideCharToAnsi(wchar_t *pWideChar) { if (!pWideChar) return NULL; char *pszBuf = NULL; int needBytes = WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, NULL, 0, NULL, NULL); if (needBytes > 0){ pszBuf = new char[needBytes+1]; ZeroMemory(pszBuf, (needBytes+1)*sizeof(char)); WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, pszBuf, needBytes, NULL, NULL); } return pszBuf; }
3)FtpCommadCheck函数的实现:
BOOL FtpCommadCheck(HINTERNET hFtp, NETINFO* pNetInfo)//测试FTP连接{CString sTmp;BOOL success = FALSE;success = FtpCommand(hFtp, FALSE, FTP_TRANSFER_TYPE_BINARY, _T("NOOP"), (DWORD)pNetInfo, NULL);if(!success){if ( WaitForSingleObject(pNetInfo->m_hEvent,1000) == WAIT_OBJECT_0 ){ResetEvent(pNetInfo->m_hEvent);success = pNetInfo->m_bSuccess;pNetInfo->m_bSuccess = FALSE;}else{success = FALSE;}}return success;}
4)NETINFO结构的定义:
typedef struct tagNetInfo {HINTERNET m_hHandle;BOOL m_bSuccess;HANDLE m_hEvent;tagNetInfo(){m_hHandle = NULL;m_bSuccess = FALSE;m_hEvent = NULL;}}NETINFO;
阅读全文
0 0
- FTP异步模型测试网络状态
- 异步网络模型
- 异步网络模型
- 异步网络模型
- win32 测试网络状态
- IOS测试网络状态
- 测试网络连接状态
- UNIX 网络 同步异步模型
- Ping测试网络连接状态
- 【网络编程】之五、异步模型
- 3种异步网络编程模型整理
- 网络异步IO操作-select模型使用
- 【网络编程】之五、异步模型
- ios - 测试网络状态是否连通 判断网络状态类型
- linux网络编程异步IO模型之—select模型 .
- FTP,TFTP网络数据流文件还原及异步存储设计
- 测试网络连接状态的批处理
- 网络状态检测方法测试结果
- 微信分享链接编码问题
- HDU 1107 武林
- URG--PSH
- Oracle Index
- Win7出现无法启动无线服务,出现无线网络未连接问题的解决方案
- FTP异步模型测试网络状态
- php offset特征造成的绕过漏洞详解
- C++Primer Plus递归一节中尺子程序的另一种写法
- Python简介
- 用Java实现某个目录下指定文件类型的内容合并
- 谷歌浏览器安装失败,解决办法
- [PAT-甲级]1011.World Cup Betting
- iOS @class
- Android中的四大组件之-Activity