TCP服务器并发编程

这里写目录标题

1,多线程TCP并发控制

基于多线程的TCP服务器并发程序

javascript 复制代码
#include <iostream>
#include <netinet/in.h>
#include <vector>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <cstring>
#include <sys/select.h>
#include<pthread.h>

using namespace std;

#define PORT 8080
#define MAX_CLIENTS 20
#define BUFFER_SIZE 1024
#define MAX  512

struct SockInfo
{
    struct  sockaddr_in  addr;
    int fd;
};

struct  SockInfo  infos[512];

void* working(void* arg);

void* working(void* arg)
{
    struct SockInfo* pinfo = (struct SockInfo*)arg;
    char ip[32];
    //inet_ntop(AF_INET,&pinfo->addr.sin_addr.s_addr,ip,sizeof(ip));
    //ntohs(pinfo->addr.sin_port);

    while(true)
    {
        char buffer[1024];
        int len = recv(pinfo->fd,buffer,sizeof(buffer),0);
        if(len > 0)
        {
            cout<<buffer<<endl;
        }
        else if(len == 0)
        {
            cout<<"客户端已经断开连接"<<endl;
            break;
        }
        else
        {
            break;
        }
    }

}


int  main()
{
    

int serverfd = socket(AF_INET,SOCK_STREAM,0);

    sockaddr_in addr;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(PORT);
    addr.sin_family = AF_INET;
    
    socklen_t len = sizeof(addr);
    bind(serverfd,(sockaddr*)&addr,len);

    listen(serverfd,MAX_CLIENTS);

    

    for(int i = 0;i<MAX;i++)
    {
        infos[i].fd = -1;
    }

    while(true)
    {
        struct  SockInfo* pinfo;
        for(int i = 0;i<MAX;i++)
        {
            if(infos[i].fd == -1)
            { 
               pinfo = &infos[i];
               break;
            }
        }

        socklen_t tmplen = sizeof(pinfo->addr);
        int cfd = accept(serverfd,(struct sockaddr*)&pinfo->addr,&tmplen);
        if(cfd == -1)
        {
            perror("accept");
            continue;
        }

        pinfo->fd = cfd;
    
        //创建子线程
        pthread_t  tid;
        pthread_create(&tid,NULL,working,pinfo);
        pthread_detach(tid);

    }

    close(serverfd);

}
相关推荐
GDAL6 小时前
Nginx TCP/UDP四层转发(Stream模块)完整深入教程
tcp/ip·nginx·udp
江畔柳前堤7 小时前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
不会就选b8 小时前
Linux之信号(二)
linux·运维·服务器
GlueNa2SiO39 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
寺中人10 小时前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
小张成长计划..11 小时前
【Linux】18:基础IO
linux·运维·服务器
扬帆破浪12 小时前
文档自动检查:用 Claude Code、OpenClaw 审 WPS 文件:预览、批注、改正文
运维·服务器·wps
zt1985q13 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
白狐_79815 小时前
408计算机网络第3章:以太网交换机与共享式以太网——知识总结
服务器·网络·计算机网络
测试运维日常笔记16 小时前
tcpdump(Linux服务器)配合 Wireshark(本地分析)使用手顺与常用过滤语法详解
linux·服务器·tcpdump