Linux网络编程入门 互动版

推荐:用 NSDT场景编辑器 快速搭建3D场景。

本小节利用上述框架,将时间获取服务端改为支持并发的服务端。 程序如下:

#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的文件,试添加业务逻辑,实现简单并发的服务端,并编译测试。 备注:测试并发服务端,需要先停止原先放置后台的程序,操作如下图所示: 15 先查询到程序的PID,利用kill终止原来进程。