时间同步服务器之网络编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称时间同步服务器设计
实验报告要求: 1.实验目的 2.实验要求 3.实验环境 4.实验作业 5.问题及解决
6.思考问题
7.实验体会
【实验目的】
一、实验目的
1、熟悉流式套接字的基本流程。
2、掌握TCP连接建立过程。
3、掌握基于TCP协议的数据发送与接收的编程。
4、掌握服务器本地时间获取与格式转换功能的编程。
二、实验内容
使用流式套接字编程,实现时间同步服务器,该服务器能够接受客户端的查询请求,
获取本地时间,并将结果发送回客户端,同时开发与服务器通信的客户端,以验证
双方交互的功能。
【实验要求】
使用流式套接字编程,实现时间同步服务器,该服务器能够接受客户端的查询请求,获取本地时间,并将结果发送回客户端,同时开发与服务器通信的客户端,以验证双方交互的功能。具体要求如下:
1熟悉流式套接字编程的基本流程。
2完成TCP连接建立过程。
3完成基于TCP的数据发送与接收功能。
4完成服务器本地时间获取与格式转换功能。
【实验环境】
1、VC 6.0++
2、windows 7
3、以太网
【实验作业】
系统中客户方与服务器从建立连接,发送同步请求到同步系统时间的流程为:在整个时间同步过程中服务器必须要处于工作状态,时刻监听着网络中客户方的请求信息,监听到客户方的时间同步请求时,根据客户方的需求,来进行服务器响应,客户方在接收到服务器的响应报文后,根据服务器发送过来的时间,以及算出的网络延时来同步系统的时间。
套接字基础概念实现一个最基本的流式套接字客户端/服务器通信程序。在该程序中,客户端和服务器将按照如下步骤交互:
1.服务器程序:
#include
#include
#include
#include
#define MAXLINE 4096
#define LISTENQ 1024
#define SERVER_PORT 13
int main(int argc, char* argv[])
{
SOCKET ListenSocket = INVALID_SOCKET, ClientSocket = INVALID_SOCKET;
int iResult;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
int iSendResult;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
iResult = WSAStartup(wVersionRequested, &wsaData);
if (iResult != 0) {
printf("WSAStartup 调用错误,错误号: %d\n", WSAGetLastError());
return -1;
}
wsaData.wVersion
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("无法找到可用的Winsock.dll版本\n");
WSACleanup();
return -1;
}
else
printf("Winsock 2.2 dll初始化成功\n");
if((ListenSocket = socket(AF_INET, SOCK_STREAM, 0))<0){
printf("socket 函数调用错误,错误号: %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERVER_PORT); /* daytime server */
iResult = bind( ListenSocket, (struct sockaddr *) & servaddr, sizeof (servaddr));
if (iResult == SOCKET_ERROR) {
printf("bind 函数调用错误,错误号: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return -1;
}
iResult = listen(ListenSocket, LISTENQ);
if (iResult == SOCKET_ERROR){
printf("listen 函数调用错误,错误号: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return -1;
}
for ( ; ; )
{
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET){
printf("accept 函数调用错误,错误号: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return -1;
}
ticks = time(NULL);
memset(buff,0,sizeof(buff));
sprintf(buff, "%.24s\r\n", ctime(&ticks));
printf("获取当前系统时间: %s\n",buff );
iSendResult = send( ClientSocket, buff, strlen(buff), 0 );
if (iSendResult == SOCKET_ERROR) {
printf("send 函数调用错误,错误号: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return -1;
}
printf("向客户端发送时间成功\n");
iResult = shutdown(ClientSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown 函数调用错误,错误号: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return -1;
}
closesocket(ClientSocket);
printf("主动关闭连接\n");
}
closesocket(ListenSocket);
WSACleanup();
return 0;
}
先是执行服务器程序进行Winsock 2.2 dll初始化:
即有截图: