传输层:SOCKET编程之“简单时间服务器实现”

该博客介绍了如何使用SOCKET在传输层实现一个简单的時間服务器,该服务器能够为客户端提供当前时间服务,当客户端请求时,显示时间信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者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)
测试结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值