Linux网络编程入门 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

我们按照服务器模型的工作流程以及API,实现一个服务端和客户端,功能如下:

  1. 运用前面章节介绍的API,保证客户端可以正常连接服务端。
  2. 客户端可以获取服务端的当前时间,即服务端将当前时间发送给客户端。

本节我们实现一个服务端,如下:

#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)。 如下图所示: 8 利用gcc编译server_time.c生成可执行文件server_time,即服务端。 执行nohup ./server_time & 将其放到系统后台。 可以通过ps -ef查看系统中进程,发现确实存在CMD为./server_time.