windows编程之socket套接字2

视频链接:http://www.rupeng.com/forum/thread-1236-1-2.html

网络授时服务,同步本机时间,主要代码:

#include "stdafx.h"

#include <windows.h>
#include <windowsx.h>
#include <winsock2.h>
#include "Resource.h"
#include "MainDlg.h"
#define HIGHTIME 21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime
#define LOWTIME 4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime


BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }


    return FALSE;
}


BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}


void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
{
SocketTest();
}
        break;
        default:
break;
    }
}


void SocketTest()
{
WSADATA wsaData;
//初始化Socket库
WSAStartup(MAKEWORD(2,0),&wsaData);
//创建一根电线
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
//设置电线连接服务器端的端口
sa.sin_port = htons(IPPORT_TIMESERVER);
//123.125.50.135是ping smtp.163.com出来的,后面会讲使用gethostbyname来直接从
//主机名得到ip地址 
sa.sin_addr.S_un.S_addr = inet_addr("128.138.140.44");
//为什么不用设置客户端的端口,难道不需要客户端的端口吗?
if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
{
ShowError();
return;
}


unsigned long ulTime=0;
//接收时间服务器返回的消息
recv(sock,(char *)&ulTime,sizeof(unsigned long),0);
ulTime = ntohl(ulTime);
//MessageBox(NULL,buff,TEXT("返回消息"),MB_OK);
SYSTEMTIME st;
UINT64 uiCurTime, uiBaseTime, uiResult;
uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
uiCurTime = (UINT64)ulTime * (UINT64)10000000;
uiResult = uiBaseTime + uiCurTime;
FileTimeToSystemTime((LPFILETIME)&uiResult, &st);


TCHAR buff[256];
ZeroMemory(buff,sizeof(buff)/sizeof(TCHAR));
wsprintf(buff,TEXT("%i年%i月%i日 %i:%i:%i"),st.wYear,st.wMonth,st.wDay,st.wHour+8,st.wMinute,st.wSecond);
MessageBox(NULL,buff,TEXT(""),MB_OK);


SetSystemTime(&st);


//做事情。把大象放冰箱总共分几步 
closesocket(sock);
WSACleanup();
}


void ShowError()
{
TCHAR* lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| //自动分配消息缓冲区
FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息
NULL,GetLastError(), //获取错误信息标识
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//使用系统缺省语言
(LPTSTR)&lpMsgBuf, //消息缓冲区
0,
NULL);
MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR); 
}


void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);

}


注意:

要改变本机时间必须以管理员身份运行程序。

总结:

看完这节,我们可以对网络授时功能有个大致的了解。有些东西视频里说的也不一定是对的,特别是这些很早之前录的视频,视频里的一些东西可能过时了。在实践的过程中,我们要发现并解决那些问题,才能得到提高。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值