作者Magic_code,转载请附上!
功能:服务器提供时间服务,客户请求时间信息并显示结果
流程如图:
头文件unp.h
1 #ifndef _UNP_H_
2 #define _UNP_H_
3 /* unp.h */
4 #ifdef cplusplus
5 extern "C"{
6 #endif
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <netinet/in.h> /* for struct sockaddr */
10 #include <string.h> /* for strlen() and snprintf() */
11 #include <stdio.h> /* for printf() */
12 #include <unistd.h> /* for read() */
13 #include <arpa/inet.h> /* for inet_pton() */
14 #include <stdlib.h> /* for exit() */
15 #define MAXLINE 512
16 #define LISTENQ 1024
17 #ifdef cplusplus
18 }
19 #endif
20 #endif /* end _UNP_H_ */
客户端测试程序time_client.c
1 #include "unp.h"
2 /* 客户端测试程序 time_client.c */
3 int main(int argc, char **argv)
4 {
5 int sockfd, count;
6 char recvline[MAXLINE + 1];
7 struct sockaddr_in serveraddr;
8 if (argc != 2)
9 printf("usage: a.out <IPaddress>\n");
10 if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
11 printf("socket error!\n");
12 bzero(&serveraddr, sizeof(serveraddr));
13 /* 使用端口1300通信 */
14 serveraddr.sin_family = AF_INET;
15 serveraddr.sin_port = htons(1300);
16 if (inet_pton(AF_INET, argv[1], &serveraddr.sin_addr) < 0)
17 printf("inet_pton error for %s\n", argv[1]);
18 /* 发出连接请求,等待服务器相应 */
19 if (connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
20 printf("connect error!\n");
21 else
22 printf("<%d> connecting\n", sockfd);
23 /* 服务器老大发来贺电,北京时间7点整 */
24 while ( (count = read(sockfd, recvline, MAXLINE)) > 0) {
25 recvline[count] = 0;
26 if (fputs(recvline, stdout) == EOF)
27 printf("fputs error!\n");
28 }
29 if (count < 0)
30 printf("read error!\n");
31 close(sockfd);
32
33 exit(0);
34 }
服务器程序time_server.c
1 #include <time.h>
2 #include "unp.h"
3
4 int main(int argc, char **argv)
5 {
6 int listenfd, connectfd;
7 struct sockaddr_in serveraddr;
8 char buffer[MAXLINE];
9 time_t current_ticks;
10
11 /* 仅为举例,省略一些异常处理 */
12 listenfd = socket(AF_INET, SOCK_STREAM, 0);
13
14 bzero(&serveraddr, sizeof(serveraddr));
15 /* 配置接收本地所有网卡请求,使用端口1300通信 */
16 serveraddr.sin_family = AF_INET;
17 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
18 serveraddr.sin_port = htons(1300);
19
20 /* 将listenfd与sockaddr绑定 */
21 bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
22
23 /* 将listenfd转换为监听描述符 */
24 listen(listenfd, LISTENQ);
25 for ( ; ;) {
26 /* 进入睡眠,等待客户端请求 */
27 connectfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
28 if (connectfd > 0)
29 printf("<%d> connecting\n", connectfd);
30 current_ticks = time(NULL);
31 /* 三次握手后,建立连接connectfd,并向客户端发送回应 */
32 snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(¤t_ticks));
33 write(connectfd, buffer, strlen(buffer));
34 close(connectfd);
35 }
36 }
简单Makefile:
1 SERVER_OBJ += time_server.o
2 SERVER_SRC += time_server.c
3 SERVER_TARGET = time_server
4 CLIENT_OBJ += time_client.o
5 CLIENT_SRC += time_client.c
6 CLIENT_TARGET = time_client
7 TARGET = $(CLIENT_TARGET) $(SERVER_TARGET)
8 CC = gcc
9 CFLAGS = -Wall -g
10
11 .phony=clean
12 all : $(SERVER_TARGET) $(CLIENT_TARGET)
13 $(SERVER_TARGET): $(SERVER_SRC)
14 $(CC) $(CFLAGS) -o $@ $^
15 $(CLIENT_TARGET): $(CLIENT_SRC)
16 $(CC) $(CFLAGS) -o $@ $^
17 clean:
18 rm -rf $(OBJ) $(TARGET)
测试结果如下: