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

}
相关推荐
EasyGBS7 小时前
摄像头还在线,画面已经不能用了?国标GB28181视频平台EasyGBS视频质量诊断怎么用
服务器·安全·音视频
程序员-Benothing8 小时前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
wdfk_prog8 小时前
LWIP教程 09:从 `tcp_slowtmr()` 到 Fast Retransmit——TCP 超时重传与重复 ACK
服务器·网络·数据库·网络协议·tcp/ip
‎ദ്ദിᵔ.˛.ᵔ₎8 小时前
linux 进程信号 (上)
linux·服务器
Zooproxy全球IP代理8 小时前
住宅IP在AI行业中的技术应用:数据采集基础设施的工程实践
人工智能·网络协议·tcp/ip
深蓝电商API8 小时前
HTTP/2 协议逆向:从 Fiddler 抓不到包说起
爬虫·网络协议·http·fiddler
迪康Defender8 小时前
终端安全审批体系设计:如何平衡安全管控与业务连续性
运维·服务器·安全·运维开发·学习方法·业界资讯·远程工作
盛世宏博智慧档案8 小时前
一文读懂 PoE+Modbus TCP 温湿度传感器布线规范与故障排查
网络·网络协议·tcp/ip