本小节利用上述框架,将时间获取服务端改为支持并发的服务端。 程序如下:
#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));
pid_t pid = fork();
if (pid == 0) {
printf("我是子进程,进行读写处理\n");
close(server_socket);
// do_something
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);
exit(0);
} else if (pid == -1) {
close(connfd);
continue;
} else {
close(connfd);
}
}
close(server_socket);
return 0;
}
第27~38行子进程处理客户端连接。
右侧打开名为server_fork.c的文件,试添加业务逻辑,实现简单并发的服务端,并编译测试。
备注:测试并发服务端,需要先停止原先放置后台的程序,操作如下图所示:
先查询到程序的PID,利用kill终止原来进程。