1、1、设计目的为了提高同学的自主动手能力,把理论知识运用于实践中,从实践中更好的领悟所学的知识.2、题目要求及需求分析1.网络 I/O 程序设计:用 Socket 套接字实现 DAYTIME 协议的服务器和客户端程序1 DAYTIME 服务器程序 daytime_s服务器程序创建一个 TCP 或 UDP 套接字,监听端口号 13 号 端口。在收到客户端程序的连接后,将服务器的本地时间以 ASCII 码形式发送到客户端。然后继续等待下一个客户端的连接。2 DAYTIME 客户端程序 daytime_c客户端程序创建一个 TCP 或 UDP 套接字,连接服务器的 13 号端口。在接收到服务器发送的日
2、期时间信息后,将其打印到屏幕上,退出。客户端运行时需要指定服务器的 IP 地址。所以客户端程序需要首先读取命令行中的 IP 地址参数。 2.客户机/服务器模式3、概要设计1.1 定义类型定义了五个字符型变量、三个整型和一个结构体变量。1.2 用到的主要函数Socket 提供的系统调用或函数socket()bind()listen()recv()close()socket()connect()recv()send()close()blocks until server receivesa connect request from clientdatadataServerClientaccept(
3、)send()connect negotiation2.1 主函数void main()定义变量while (1) if (设置“TCP 或者 UDP”)if (ssock #include #include“connectsock.c“#include “errexit.c“#pragma comment (lib,“ws2_32“)#defineLINELEN 128void main()char *a100;char *host=a;struct sockaddr_in sin; /* the from address of a client*/int s;char *service =
4、 “13“; /* 端口号 */char *transport = “tcp“;/*“tcp“ or “udp“*/char bufLINELEN+1; /* buffer for one line of text */int n; /* socket, 读入计数*/int alen;#if defined WIN32WSADATA wsadata;WSAStartup(1, #endifprintf(“请输入服务器的 IP 地址:“);scanf(“%sn“,a);printf(“显示当前时间: n“);s = connectsock(host, service, transport);if
5、(s 0) bufn = 0; /* ensure null-terminated, 定义bufLINELEN+1而不是 bufLINELEN是为了避免 buffer overflow*/fputs(buf, stdout);elsesendto(s, “Get Time“, 8, 0, (struct sockaddr *) alen = sizeof(sin);n = recvfrom(s, buf, LINELEN, 0, (struct sockaddr *) bufn = 0;fputs(buf, stdout);closesocket(s);#if defined WIN32WSA
6、Cleanup();#endif 2. DAYTIME 客户端程序 daytime_c#include#include #include#include “passivesock.c“#include “errexit.c“#pragma comment (lib,“ws2_32“)#define QLEN 32#define MAX_MSG 100void main()char *host=“127.0.0.1“;struct sockaddr_in csin; /* 客服端地址 */int msock, ssock; /* master char *service = “13“; /* 端
7、口*/char *transport = “tcp“;/*“tcp“ or “udp“*/time_t now; /* 当前时间 */char *pts; /* pointer to time string */char msgMAX_MSG;int n;#if defined WIN32WSADATA wsadata;WSAStartup(2, #endifmsock = passivesock(service, transport, QLEN); printf(“wait for requests for service:%sn“, service);while (1) if (strcm
8、p(transport, “tcp“) = 0)alen = sizeof(csin);ssock = accept(msock, (struct sockaddr *)if (ssock 0)printf(“accept failedn“);break;elsealen = sizeof(csin);n = recvfrom(msock, msg, MAX_MSG, 0, (struct sockaddr *) if(n0) printf(“accept failed“);break; time(pts = ctime(if (strcmp(transport, “tcp“) = 0)send(ssock, pts, strlen(pts), 0);closesocket(ssock);elsealen = sizeof(csin);sendto(msock, pts, strlen(pts), 0, (struct sockaddr *) closesocket(msock);#if defined WIN32WSACleanup();#endif5、调试分析1.1 打开服务器端,等待客服端建立连接服务器程序创建一个 TCP 套接字,监听端口号 13 号端口。2.1 打开客户端准备连接服务器端客户端程序创建一个 TCP 或 UDP 套接字,连接服务器的 13 号