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);

}
相关推荐
开开心心_Every5 分钟前
网络管理员IP配置工具:设置多台电脑地址
运维·服务器·网络·网络协议·学习·tcp/ip·edge
时空无限5 分钟前
网络包匹配路由的原则是啥 从 01 与啥的运算讲起
运维·服务器·网络
大柏怎么被偷了13 分钟前
【Linux】信号
linux·运维·服务器
北京耐用通信20 分钟前
耐达讯自动化Profibus总线光纤中继器在连接测距仪中的应用
人工智能·物联网·网络协议·网络安全·自动化·信息与通信
Jia ming21 分钟前
大小端模式:字节顺序的奥秘
linux·运维·服务器
Zach_yuan26 分钟前
Linux 线程入门到理解:从 pthread 使用到线程库底层原理
linux·运维·服务器
不会kao代码的小王34 分钟前
深信服超融合 HCI 核心技术解析:aSV、aSAN 与 aNET 的协同架构
运维·服务器·网络·数据库·github
a程序小傲38 分钟前
中国邮政Java面试被问:边缘计算的数据同步和计算卸载
java·服务器·开发语言·算法·面试·职场和发展·边缘计算
翼龙云_cloud41 分钟前
亚马逊云渠道商:如何在AWS控制台中创建每月成本预算?
服务器·云计算·aws
小尧嵌入式1 小时前
【Linux开发二】数字反转|除数累加|差分数组|vector插入和访问|小数四舍五入及向上取整|矩阵逆置|基础文件IO|深入文件IO
linux·服务器·开发语言·c++·线性代数·算法·矩阵