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

}
相关推荐
一叶龙洲9 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
凌云C11 小时前
5G 协议体系与交互流程
网络协议
keyipatience12 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
踏月的造梦星球12 小时前
达梦数据库执行计划与性能分析入门:EXPLAIN、AUTOTRACE 与 ET
服务器·数据库·oracle
星夜夏空9913 小时前
网络编程(1)
服务器·网络
川石课堂软件测试13 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
X7x515 小时前
跨厂商路由引入(重发布)实战指南:华为、华三、思科的逻辑差异与配置避坑
网络协议·信息与通信·信号处理·实施路由引入
玩转4G物联网16 小时前
FS800DTU 新品上线|免费使用 DMP 设备管理平台,支持远程批量配置 & OTA 升级
物联网·网络协议·tcp/ip·云平台·核心板·fs800dtu·iot管理平台
就不掉头发16 小时前
计算机的虚拟内存
linux·服务器·windows
暴力求解16 小时前
Linux ---线程控制(二)
linux·运维·服务器·操作系统