初探WinInet網路api
阿新 • • 發佈:2022-05-03
//必須的標頭檔案,而且要連結wininet.lib #include <WinInet.h> #define UM_SOCKET (WM_USER + 1) void CNetTimeDlg::OnBnClickedOk() { // TODO: 在此新增控制元件通知處理程式程式碼 // CDialogEx::OnOK(); // 使用winsocket,獲取國際標準時間並設定系統時間 WSADATA WSAData = { 0 }; int iError = 0; iError = WSAStartup(MAKEWORD(2, 2), &WSAData);//我這裡成功了,但是載入的是2.0版本,WSAData.szDescription可以檢視 if (iError != 0) { MessageBoxA(m_hWnd, WSAData.szDescription, "WSAStartup", MB_OK); return; } SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { MessageBoxA(m_hWnd, WSAData.szDescription, "socket", MB_OK); WSACleanup(); return; } iError = WSAAsyncSelect(sock, m_hWnd, UM_SOCKET, FD_READ | FD_CONNECT); if (iError != 0) { MessageBoxA(m_hWnd, WSAData.szDescription, "WSAAsyncSelect", MB_OK); WSACleanup(); return; } sockaddr_in sa = { 0 }; sa.sin_family = AF_INET; sa.sin_port = htons(37); sa.sin_addr.S_un.S_addr = inet_addr("132.163.4.101"); connect(sock, (SOCKADDR*)&sa, sizeof(sa)); if (WSAEWOULDBLOCK != (iError = WSAGetLastError())) { MessageBoxA(m_hWnd, WSAData.szDescription, "WSAGetLastError", MB_OK); closesocket(sock); WSACleanup(); return; } } LRESULT CNetTimeDlg::OnSocket(WPARAM wParam, LPARAM lParam) { WORD wEvent = WSAGETSELECTEVENT(lParam); WORD wError = WSAGETSELECTERROR(lParam); SOCKET sock = wParam; SYSTEMTIME stNew = {1900,1,0,1,0,0,0,}; FILETIME ftNew;//The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). unsigned long ultime = 0; int isize = 0; switch (wEvent) { case FD_CONNECT: //MSG_PEEK標記不刪除緩衝區資料,所以下次recv仍可以讀取這次讀到的資料,這裡是防止非阻塞下讀不到完整的4位元組資料 isize = recv(sock, (char*)&ultime, 4, MSG_PEEK); break; case FD_READ: isize = recv(sock, (char*)&ultime, 4, 0); ultime = ntohl(ultime); SystemTimeToFileTime(&stNew, &ftNew); *(LONGLONG*)(&ftNew) += (LONGLONG)pow(10.0,9) / 100 * ultime; FileTimeToSystemTime(&ftNew, &stNew); SetSystemTime(&stNew); break; } return 0; } void CNetTimeDlg::OnBnClickedFtp() { // TODO: 在此新增控制元件通知處理程式程式碼 // 使用WinInet訪問ftp伺服器並下載檔案 char szError[64] = { 0 }; char szDir[MAX_PATH] = { 0 }; DWORD len = MAX_PATH; HINTERNET hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hInternet == NULL) { sprintf(szError, "InternetOpen error : %d", GetLastError()); MessageBoxA(m_hWnd, szError, "error", MB_OK); return; } HINTERNET hFtpSession = InternetConnectA(hInternet, "192.168.3.95", INTERNET_DEFAULT_FTP_PORT, "admin", "admin", INTERNET_SERVICE_FTP, 0, 0); if (hFtpSession == NULL) { sprintf(szError, "InternetConnectA error : %d", GetLastError()); MessageBoxA(m_hWnd, szError, "error", MB_OK); InternetCloseHandle(hInternet); return; } if (!FtpSetCurrentDirectoryA(hFtpSession, "/test")) { sprintf(szError, "FtpSetCurrentDirectoryA error : %d", GetLastError()); MessageBoxA(m_hWnd, szError, "error", MB_OK); InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); return; } WIN32_FIND_DATAA finddata; HINTERNET hFind = FtpFindFirstFileA(hFtpSession, "*.txt", &finddata, 0, 0); if (hFind == NULL) { MessageBoxA(m_hWnd, "no find file", "error", MB_OK); InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); return; } do { FtpGetFileA(hFtpSession, finddata.cFileName, finddata.cFileName, TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0); } while (InternetFindNextFileA(hFind, &finddata)); InternetCloseHandle(hFind); InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); }