【C语言】【windows】--网络校时
erbi_lucifer吧
全部回复
仅看楼主
level 10
堕erbi 楼主

光影的世界……吾为光为影?



2012年03月02日 20点03分 1
level 10
堕erbi 楼主

程序名称:网络校时
程序大小:510K
编译环境:vs2010(其它编译器也可以)
文件包括:网络校时.exe ,skin.she,skin.dll,msvcr100.dll
程序界面:

2012年03月03日 04点03分 2
level 10
堕erbi 楼主

2012年03月03日 04点03分 3
level 10
堕erbi 楼主
/*************************************************************************************************************
首先,这个程序的工程包括:
/*************************************************************************************************************

2012年03月03日 04点03分 4
level 10
堕erbi 楼主
/*************************************************************************************************************
资源文件:dialog对话框两个,图标,最后那个是version(程序信息,如发行公司等,这个文件可以省略)
头文件:resource.h是添加资源时编译器帮你生成的……
时间设置.h是用来声明函数,头文件等的
源文件:那个“111.txt”请无视……%>_<% [鲁拉]
Fustion.cpp(本来要打fusion的习惯性又拼错了……⊙﹏⊙b)是用来放自定义函数的…… [拍砖]
那个网络校时.cpp是放主函数和第一个对话框的消息处理函数
那个自定义时间.cpp是用来放第二个对话框的消息处理函数。
/*************************************************************************************************************
2012年03月03日 04点03分 5
level 10
堕erbi 楼主

/*************************************************************************************************************
先看看“时间设置.h”:[抖胸]
#include <tchar.h>
#include <Windows.h>
#include<stdio.h>
#include "resource.h"
#pragma comment(lib,"ws2_32.lib")//用winsocket需要的连接库
extern "C" __declspec(dllimport) int __stdcall SkinH_Attach();//定义外部函数,用于换肤
#pragma comment(lib,"SkinH.lib") //皮肤的连接库
#define HIGHTIME 21968699 //处理时间的宏,高字节
#define LOWTIME 4259332096 //处理时间的宏,低字节
FILETIME.lowtime
[飘过]
宏定义,后面的是时间服务器的IP地址
#define TIME_A "132.163.4.101"
#define TIME_B "132.163.4.102"
#define TIME_C "132.163.4.103"
#define UTCNIST "128.138.140.44"
#define SYMMETRICOM "69.25.96.13"
#define AOL_VA "64.236.96.53"
[Kiss]
以下是自己定义的函数,会在“fustion.cpp”里面实现它们……
INT_PTR CALLBACK DialogProc2(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
SYSTEMTIME GetNetTime(HWND hwnd); //得到网络标准时间
SYSTEMTIME ChangeTime(unsigned long dwTime);//转化为结构体
void ShowError();//错误提示
void SetComboBox(HWND hwnd);//初始化combobox
char * GetComboBoxIP(HWND hwnd);//得到combobox的内容并返回相应IP
WORD GetTime(HWND hwnd,int ID);//得到TEXT转化为word
void GetTextTime(HWND hwnd);//得到输入的内容,并设置时间
/*************************************************************************************************************
2012年03月03日 04点03分 6
level 10
堕erbi 楼主

/*************************************************************************************************************
001.得到网络标准时间
/*************************************************************************************************************
[星星闪]
这是网络编程,当然会用到socket(套接字)……
01. 初始化socket。让底层的驱动程序做好准备,如果初始化失败,整个程序就用不了了……
02. 建立一个socket。
03. 进行连接。
04. 接收服务器信息。
05. 显示接受的信息。
06. 设置系统时间。
以上就是整个程序的大概思路……
[瘫坐]
2012年03月03日 04点03分 7
level 10
堕erbi 楼主

/*************************************************************************************************************
01. 初始化:
/*************************************************************************************************************
[背扭]
WSADATA wsaData;
WSAStartup( MAKEWORD(2,0), &wsaData ) ;
参数一是socket的版本,这样windows才知道要用的是哪个dll……
参数二是一个储存信息的结构体。socket的相关信息就是储存在这个结构体里面,但这里我们不用理他。

2012年03月03日 04点03分 8
level 10
堕erbi 楼主

/*************************************************************************************************************
02. 建立:[瞌睡]
/*************************************************************************************************************
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
参数一是地址族,AF_INET表示TCP/IP族。参数二是服务类型,SOCK_STREAM是流式套接字,参数三是协议,IPPROTO_TCP是TCP/IP协议

2012年03月03日 04点03分 9
level 10
堕erbi 楼主
/*************************************************************************************************************
03. 连接:
/*************************************************************************************************************
[正Music]
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
sa.sin_port=htons(IPPORT_TIMESERVER);
sa.sin_addr.S_un .S_addr =inet_addr(GetComboBoxIP(hwnd));
connect(sock,(SOCKADDR *)&sa,sizeof(sa);
定义结构体sa
连接的地址族是TCP/IP
目标主机的端口,这里需要的是时间服务的端口,于是是:IPPORT_TIMESERVER
sa.sin_addr.S_un .S_addr是目标主机的IP地址,这里用的是自定义函数GetComboBoxIP(hwnd)的返回值(也就是头文件定义的那些宏)
connect(sock,(SOCKADDR *)&sa,sizeof(sa);
参数一是socket的句柄。
参数二是上面的结构体。

2012年03月03日 04点03分 10
level 10
堕erbi 楼主
文档还没写完,过两天会继续去完成它,今天在整【读取MP3信息】的控制台版,[拍砖],如果要写音乐播放器时可以使用O(∩_∩)O哈哈~……
2012年03月03日 08点03分 11
level 10
堕erbi 楼主

/*************************************************************************************************************
04.接收服务器信息。
/*************************************************************************************************************
unsigned long ulTime;//无符号长整形变量
recv(sock,(char *)&ulTime,sizeof(unsigned long),0);
ulTime=ntohl(ulTime);
[飘过]
recv用于接收数据并将接收到的数据放入字符数组里。
int recv(sock句柄,要来储存时间的变量,变量的大小,0);
最后的参数一般是0.函数执行成功返回接收数据的字节数,网络中断返回0,出错时返回SOCK_ERROR

2012年03月07日 04点03分 12
level 10
堕erbi 楼主

网络时间的格式不一定和自己电脑的时间格式一样,于是我们需要用 ntohl函数,将网络时间的格式更改为本机时间格式
我们接收到时间是从1900年1月1日到现在总共多少秒,我们还要将它们转换为现在的年月日时分秒……[拍砖]
2012年03月07日 04点03分 13
level 10
堕erbi 楼主

/*************************************************************************************************************
05.显示接受的信息。
/*************************************************************************************************************
/*******************************************************************************
将时间(1900年1月1日到现在总共多少秒转化为SYSTEMTIME型时间)
*******************************************************************************/
SYSTEMTIME ChangeTime(unsigned long dwTime)
{
SYSTEMTIME st;
UINT64 uiCurTime, uiBaseTime, uiResult;
uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
uiCurTime = (UINT64)dwTime * (UINT64)10000000;
uiResult = uiBaseTime + uiCurTime;
FileTimeToSystemTime((LPFILETIME)&uiResult, &st);
return st;
}
[抖胸]

2012年03月07日 04点03分 14
level 10
堕erbi 楼主

直接调用上面那个函数(进行移位后使用FileTimeToSystemTime转换成时间结构体……⊙﹏⊙b)
SYSTEMTIME st;
st= ChangeTime(ulTime);
用sprintf将要显示的信息放入字符数组里面。
sprintf_s(buffer,"%d 年%d 月%d 日%d 时%d 分%d 秒",st.wYear ,st.wMonth ,st.wDay ,st.wHour+8 ,st.wMinute ,st.wSecond );
MessageBoxA(NULL,buffer,"时间",MB_OK|MB_ICONINFORMATION);
弹窗显示时间……[鲁拉]
由于我们中国是在世界时区的东八区,于是要在小时上加上8!
最后不要忘记将建立的socket销毁(否则很占资源):closesocket(sock);
2012年03月07日 04点03分 15
level 10
堕erbi 楼主

/*************************************************************************************************************
06.设置系统时间。
/*************************************************************************************************************
就一句:SetSystemTime(&st);
[我爱牛奶]

2012年03月07日 04点03分 16
level 10
堕erbi 楼主

/************************************************************************************************
以上,我们就已经完成最重要的部分了
接下来是用户自定义时间的事了。
用文本框让用户输入数据,然后赋值给SYSTEMTIME结构体的各个值。
最后调用时间设置函数设置时间!
************************************************************************************************/
注意:时间设置需要权限!win7之类的系统需要【以管理员身份打开】才能有效……
之前的病毒们太狂了,更改系统时间让杀毒软件过期失效……于是更改系统时间是抓
很严的……%>_<%
[拍砖]
2012年03月07日 04点03分 17
level 10
堕erbi 楼主

接下来还是第一个窗口,网络对时……
找一些对时服务器的IP,当你连接服务器是它就自动发送时间数据过来。
在窗口初始化的时候,发送消息让combobox显示网址供用户选择。
当用户按下获取时间或应用时。根据用户选择的网站连接服务器……[88]
2012年03月07日 04点03分 18
level 10
堕erbi 楼主

/*************************************************************************************************************
02. 得到Combobox显示内容并返回相应IP
/*************************************************************************************************************
TCHAR SThide[50]={0};
GetDlgItemText(hwnd, IDC_COMBO1, SThide, sizeof(SThide));
[揉脸]
用GetDlgItemText(窗体句柄,控件ID,字符数组,要得到的字符串大小);
得到文本框内容,然后使用_tcscmp(宽字符版的strcmp)比较字符串,得到用户选择的是哪一个网站,然后返回该网站的IP(那些IP在头文件有定义)

2012年03月07日 04点03分 20
level 10
堕erbi 楼主

/************************************************************************************************
以上完成了网络对时部分
接下来是用户自定义
************************************************************************************************/
[鲁拉]
2012年03月07日 04点03分 21
1 2 3 尾页