当前位置: 首页 > article >正文

Linux 实现TCP并发服务器

并发服务器 实现多个进程能同时访问服务器

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 8888
#define BUF_SIZE 1024

void handle_client(int client_fd) {
    char buf[BUF_SIZE];
    ssize_t recv_len;

    while ((recv_len = recv(client_fd, buf, BUF_SIZE, 0)) > 0) {
        buf[recv_len] = '\0'; // 确保字符串以空字符结尾
        printf("收到消息:%s\n", buf);

        // 回显收到的消息
        send(client_fd, buf, recv_len, 0);
    }

    if (recv_len == 0) {
        printf("客户端关闭连接。\n");
    } else {
        perror("recv failed");
    }

    close(client_fd);
    exit(0);
}

int main() {
    int server_fd, client_fd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_addr_len = sizeof(client_addr);

    // 创建套接字
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("socket failed");
        exit(1);
    }

    // 允许地址重用
    int on = 1;
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
        perror("setsockopt failed");
        exit(1);
    }

    // 绑定地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind failed");
        exit(1);
    }

    // 监听连接请求
    if (listen(server_fd, 10) == -1) {
        perror("listen failed");
        exit(1);
    }

    printf("服务器启动,监听端口 %d...\n", PORT);

    while (1) {
        // 接受连接请求
        client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
        if (client_fd == -1) {
            perror("accept failed");
            continue;
        }

        printf("客户端连接:%s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        // 创建子进程处理客户端请求
        if (fork() == 0) {
            // 子进程关闭服务器套接字
            close(server_fd);
            handle_client(client_fd);
            exit(0);
        } else {
            // 父进程关闭客户端套接字
            close(client_fd);
        }
    }

    // 关闭服务器套接字
    close(server_fd);
    return 0;
}


http://www.kler.cn/a/398764.html

相关文章:

  • 计算机组成原理笔记----基础篇
  • 计算机网络:运输层 —— TCP的流量控制
  • LeetCode --- 143周赛
  • SpringBoot集成itext导出PDF
  • Android Mobile Network Settings | APN 菜单加载异常
  • 【Linux庖丁解牛】—Linux基本指令(下)!
  • 大模型呼叫中心,如何建设呼入机器人系统?
  • Ceph后端两种存储引擎介绍
  • FreeRTOS学习13——任务相关API函数
  • 《Django 5 By Example》阅读笔记:p76-p104
  • 20.useMediaQuery
  • HTTP 请求方式
  • 从零入门激光SLAM(二十三)——direct_visual_lidar_calibration全型号激光雷达-相机标定包
  • 永磁同步电机负载估计算法--直接计算法
  • 【C#】C#编程基础:探索控制台应用与数据操作
  • 网络安全技术概论知识点
  • Go语言的创始人, 核心特性和学习资源
  • 【设计模式】结合Tomcat源码,分析外观模式/门面模式的特性和应用场景
  • AI大模型如何重塑软件开发流程:智能化与自动化的新时代
  • git相关知识
  • 在Chrome DevTools中,怎样查看调用堆栈?
  • Django 搭建数据管理web——商品管理
  • Oracle手工创建数据库和多环境变量下如何连接指定的数据库
  • YouQu使用手册【元素定位】
  • 小程序-基于java+SpringBoot+Vue的智能小程序商城设计与实现
  • 华为HCIP——MSTP/RSTP与STP的兼容性