这里写目录标题
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);
}