我们按照服务器模型的工作流程以及API,实现一个服务端和客户端,功能如下:
- 运用前面章节介绍的API,保证客户端可以正常连接服务端。
- 客户端可以获取服务端的当前时间,即服务端将当前时间发送给客户端。
本节我们实现一个服务端,如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h> // sockaddr_in
#include <sys/socket.h>
#include <unistd.h>
#include <time.h>
int main()
{
// 此处省略重复代码
while (1)
{
printf("等待连接中...\n");
int connfd = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // connect socket
if (connfd == -1) {
perror("accept error");
exit(1);
}
printf("accept ok\n");
printf("connect from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
char time_message[100];
timer_t now_time = (timer_t)time(NULL);
snprintf(time_message, sizeof(time_message), "%.24s\n", ctime((const timer_t)&now_time));
send(connfd, time_message, sizeof(time_message), 0);
close(connfd);
}
close(server_socket);
return 0;
}
第7行引入了头文件time.h,其声明了处理日期与时间类型的函数。
第13行while(1)循环,保证服务端在不发生异常的时候,一直循环提供服务。
第16行输出连接客户端的ip地址以及端口号。
第26~28行产生当前服务端的时间。其中第56行time函数返回当前日历时间,第57行利用ctime函数生成当地时间,并将当地时间写入time_message字符数组。
第30行利用send函数将时间发送给客户端。
右侧打开名为server_time的c文件,试编写个时间获取服务端,并编译测试。
考虑到环境只有一个终端,我们利用nohup命令将服务端放置到系统后台。nohup命令格式如下:
nohup Command &
通过使用nohup命令,该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。
如下图所示:
利用gcc编译server_time.c生成可执行文件server_time,即服务端。
执行nohup ./server_time & 将其放到系统后台。
可以通过ps -ef查看系统中进程,发现确实存在CMD为./server_time.