Linux由于其开源互通的属性,在业内有许多的开源版本,个人用户普遍接受到的最直观的系统主要是体系较为完善Ubuntu系统,但大部分Linux系统在设计之初就没有相对应的图形界面,各个方向需要专注安全、稳定、维护成本和企业需求等进行特化。

主要有Red Hat Enterprise Linux (RHEL)

Red Hat Enterprise Linux operating systemA stable, high-performance Linux platform with built-in security and management features to help you run critical workloads anywhere in the hybrid cloud.https://www.redhat.com/en/technologies/linux-platforms/enterprise-linuxCentOS / CentOS StreamCentOS Stream - The CentOS Projecthttps://www.centos.org/centos-stream/SUSE Linux Enterprise Server (SLES)SUSE Linux Enterprise Server Distribution | OS(操作系统)| SUSESUSE Linux Enterprise Server 是一种 Linux 服务器操作系统,有助简化您的 IT 环境。您可以跨内部部署环境和公共云环境轻松地部署工作负载。https://www.suse.com/zh-cn/products/server/Debian GNU/LinuxDebian -- 通用操作系统 https://www.debian.org/index.zh-cn.html

1.TCP/UDP网络

        简单想象一个场景两个大型星舰的上的小型飞行器需要互相进行物质运输,这时候飞行器的需要对星舰发射激光来确认这份物质是否能够进行运输。

        这里可以把这些小型飞行器视为“状态机”概念,而这发射的激光可以理解为“握手”机制,你可以入门网络协议了,网络协议在网络内容核心主要就在“验证”和“传输”,而在早期互联网技术还没有蓬勃兴起的时候,信息都以文件的形式进行传播和传递,这就想这些飞行器们在各个星舰中进行“物资”(数据)的运输,不过为了防治网络病毒和骇客入侵等一系列问题,都有必要完成一项统一的协定和标准进行信息网络的搭建。

“握手”:三次握手、四次握手

        三次握手:让星舰A(客户端)和星舰B(服务器)都能正常的发送和接受物资(数据);

  1. 第一次握手:客户端发送SYN(同步)包到服务器,表示“我想建立连接”。

  2. 第二次握手:服务器回复SYN-ACK(同步-确认)包,表示“我同意连接,请确认”。

  3. 第三次握手:客户端发送ACK(确认)包,双方确认连接建立,开始传输数据。

这里就像运输机器人要对运输的物质进行识别,不过这里需要发射三次包涵不同信息的激光,里面要有不同双方认同的数据内容进行识别具体的约定的信息才进行“传输”这个动作。

        四次握手:确保双方数据(物质)已经发送完毕后再安全关闭连接;

  1. 第一次挥手:客户端发送FIN(终止)包,表示“我要关闭连接”。

  2. 第二次挥手:服务器回复ACK,表示“收到关闭请求,但可能还有数据要发”。

  3. 第三次挥手:服务器发送FIN包,表示“我的数据发完了,也要关闭连接”。

  4. 第四次挥手:客户端回复ACK,双方确认关闭,连接终止。  

具体的专业内容本文就不去细细研究了, 这里看Linux系统中网络协议是如何实现的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>

#define PORT 8080
#define MAX_CONNECTIONS 5

void* handle_client(void* arg) {
    int client_socket = *(int*)arg;
    char buffer[1024] = {0};
    // 读取客户端数据
    read(client_socket, buffer, sizeof(buffer));
    printf("Received: %s\n", buffer);
    // 回传响应
    const char* response = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello from embedded server!";
    send(client_socket, response, strlen(response), 0);
    close(client_socket);
    return NULL;
}

int main() {
    int server_fd, client_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    
    // 创建TCP socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    
    // 绑定端口
    if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    
    // 监听端口
    if (listen(server_fd, MAX_CONNECTIONS) < 0) {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }
    
    printf("Server listening on port %d...\n", PORT);
    
    while (1) {
        // 接受客户端连接
        if ((client_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
            perror("accept failed");
            continue;
        }
        
        // 为每个客户端创建线程
        pthread_t thread_id;
        if (pthread_create(&thread_id, NULL, handle_client, &client_socket) != 0) {
            perror("pthread_create failed");
            close(client_socket);
        }
        // 分离线程(避免内存泄漏)
        pthread_detach(thread_id);
    }
    
    return 0;
}

代码要素解析:

socket():创建TCP套接字。

bind() & listen():绑定端口并开始监听。

accept():接受客户端连接请求。

pthread_create():为每个客户端连接创建新线程。

handle_client():线程函数,处理客户端请求(示例实现了一个简单的HTTP响应)。

推荐课程:CS144-斯坦福大学-计算机网络

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐