原创作者:Unicorn (白色猎人)
信息来源:邪恶八进制团队(EST)
C/S版的时间校验程序
昨天有一MM加我QQ让我帮她调试个课程设计,一个时间校验程序。由于她自己写的代码有如天女散花,我实在看不懂,呵呵,所以只好自己重新帮她写了个,由于时间仓促,就简单的写了个,代码非常简单,纯粹练手。
本程序在windows2000 + VC6.0下测试通过
客户端代码:
复制内容到剪贴板
代码:
/*
* 时间校验程序客户端 V1.0
*
* 使用协议:TCP
*
* 监听端口:1984
*
* 代码编写:Unicorn
*
* 编写时间:2006/6/28 00:00:00
*/
#include <Winsock2.h>
#include <stdio.h>
#include <time.h>
#pragma comment (lib, "ws2_32.lib")
void main(int argc, char *argv[])
{
WSADATA wsaData;
int nRet;
char szDestIp[1024];
char szPort[1024];
char sendBuf[1024];
SYSTEMTIME revst;
//判断输入的参数是否是3个,如果不是,将出现使用帮助
if (argc != 3)
{
printf("Usage: %s [DestIP] [Port]\n", argv[0]);
return;
}
strcpy(szDestIp, argv[1]); //把第2个参数存入变量szDestIp中
strcpy(szPort, argv[2]); //把第3个参数存入变量szPort中
nRet = WSAStartup(MAKEWORD(1, 1), &wsaData); //初始化套接字,如果成功返回0,否则返回个错误代码
if (nRet != 0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); //创建一个套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr(szDestIp);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(atoi(szPort));
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //连接
recv(sockClient, (char*)&revst, 100, 0); //接收数据包
sprintf(sendBuf, "IP地址为:%s的客户进行了1次时间校验请求!", inet_ntoa(addrSrv.sin_addr));
send(sockClient,sendBuf,strlen(sendBuf)+1,0); //发送数据包
SYSTEMTIME st;
GetSystemTime(&st); //获得系统时间
st.wYear = revst.wYear;
st.wMonth = revst.wMonth;
st.wDay = revst.wDay;
st.wHour = revst.wHour;
st.wMinute = revst.wMinute;
st.wSecond =revst.wSecond;
if (!SetLocalTime(&st)) //设置系统时间
{
printf("%s\n", "设置时间失败,请重试!");
}
else
{
printf("%s\n", "设置时间成功!");
}
closesocket(sockClient); //关闭套接字
WSACleanup();
}服务端代码:
复制内容到剪贴板
代码:
/*
* 时间校验程序服务端 V1.0
*
* 使用协议:TCP
*
* 监听端口:1984
*
* 代码编写:Unicorn
*
* 编写时间:2006/6/28 00:00:00
*/
#include <Winsock2.h>
#include <stdio.h>
#include <Time.h>
#pragma comment (lib, "ws2_32.lib") //连接Winsock的lib库
void main()
{
WSADATA wsaData;
int nRet;
nRet = WSAStartup(MAKEWORD(1, 1), &wsaData); //初始化套接字,如果成功则返回0,否则返回个错误代码
if (nRet != 0)
{
printf("%s\n", "初始化套接字失败,请重试!");
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
printf("服务器监听端口为:%s\n", "1984");
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); //创建一个套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(1984);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //在套接字上绑定一个IP和Port
listen(sockSrv, 5); //监听
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
char recvBuf[100];
SYSTEMTIME st;
GetLocalTime(&st); //获得系统当前时间
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
send(sockConn, (char*)&st, sizeof(st), 0); //发送数据包
recv(sockConn, recvBuf, 100, 0); //接收数据包
printf("%s\n", recvBuf);
closesocket(sockConn); //关闭套接字
}
}