文档章节

一个简单的并发服务器

西加加程序猿
 西加加程序猿
发布于 2015/11/05 17:10
字数 287
阅读 12
收藏 0
#include<stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <sys/select.h>
 
#define SA struct sockaddr
#define MAX_THREAD_NUM 10240
 
pthread_mutex_t g_lock;
pthread_cond_t g_cond;
int g_set = 0;
int g_get = 0;
int g_connfd[MAX_THREAD_NUM];
 
void Init()
{
 g_set = 0;
 g_get = 0;
 memset(g_connfd, 0, sizeof(g_connfd));
 pthread_mutex_init(&g_lock, NULL);
 pthread_cond_init(&g_cond, NULL);
}
 
void DeInit()
{
 pthread_mutex_destroy(&g_lock);
 pthread_cond_destroy(&g_cond);
}
 
int Listen()
{
 int listenfd = socket(AF_INET, SOCK_STREAM, 0);
 struct sockaddr_in addr;
 addr.sin_family = AF_INET;
 addr.sin_port = htons(56000);
 addr.sin_addr.s_addr = 0;
 socklen_t len = sizeof(addr);
 int ret = bind(listenfd, (SA*)&addr, len);
 if(ret < 0)
 {
  perror("");
 }
 setsockopt(listenfd, SO_REUSEADDR, 0, 0, 0);
 
 ret = listen(listenfd, 10240);
 if(ret < 0)
 {
  perror("");
 }
 printf("listening...\n");
 
 return listenfd;
}
  
void Reflection(int fd)
{
 fd_set readSet,writeSet;
 FD_ZERO(&readSet);
 FD_ZERO(&writeSet);
 FD_SET(fd, &readSet);
 FD_SET(fd, &writeSet);
 struct timeval timeOut = {3, 0};
 int ret = select(fd+1, &readSet, &writeSet, NULL, &timeOut);
 if(ret > 0)
 {
  if(FD_ISSET(fd, &readSet) && FD_ISSET(fd, &writeSet))
  {
   char buf[64] = {0};
   read(fd, buf, sizeof(buf));
   write(fd, buf, strlen(buf));
  }
 }
}
 
void * ThreadMain(void* para)
{
 pthread_detach(pthread_self());
 while(1)
 {
  pthread_mutex_lock(&g_lock);
  while(g_set == g_get)
  {
   pthread_cond_wait(&g_cond, &g_lock);
  }
  
  Reflection(g_connfd[g_get]);
  close(g_connfd[g_get]);
  
  g_get++;
  if(g_get == MAX_THREAD_NUM)
  {
   g_get = 0;
  }
  pthread_mutex_unlock(&g_lock);
 }
 return NULL;
}
 
void StartServer(int fd)
{
 while(1)
 {
  struct sockaddr_in clientaddr;
  socklen_t len = sizeof(clientaddr);
  int connfd = accept(fd, (SA*)&clientaddr, &len);
  if(connfd > 0)
  {
   pthread_mutex_lock(&g_lock);
   g_connfd[g_set] = connfd;
   g_set++;
   if(g_set == MAX_THREAD_NUM)
   {
    g_set = 0;
   }
   pthread_mutex_unlock(&g_lock);
   pthread_cond_signal(&g_cond);
  }
 }
}
 
void CreateThreadPool()
{
 int i = 0;
 for(i = 0; i < MAX_THREAD_NUM; i++)
 {
  pthread_t tid;
  int ret = pthread_create(&tid, NULL, ThreadMain, NULL);
  if(ret < 0)
  {
   printf("pthread_create failed!\n");
  }
 }
}

  
int main()
{
 Init();
 CreateThreadPool();
 StartServer(Listen());
 DeInit();
 return 0;
}

© 著作权归作者所有

西加加程序猿
粉丝 0
博文 1
码字总数 287
作品 0
珠海
程序员
私信 提问
web服务器该选择apache还是nginx

PHP小白必知: web服务器该选择apache还是nginx? 一、apache与nginx的区别: 1、二者最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可...

代金券优惠
2018/05/02
0
0
压力测试的轻量级具体做法

一:压力测试中需要掌握的几个基本概念 1:吞吐率(Requests per second) 服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单...

晨曦之光
2012/06/08
439
0
[Python] 网络编程(Socket)

1. Socket基础 客户端与服务器连接有两种方式:TCP和UDP,TCP是面向连接的方式(三次握手、四次挥手等),可靠但耗资源,而UDP采用无连接方式,不可靠但速度快。这里面的学问很多,但大部分人...

长平狐
2013/06/03
256
0
libGod-2.0.3-testing 发布,全异步网络库

简介 libGod是一个全异步+协程机制实现的网络库,巧妙的利用协程,将复杂的异步逻辑转换为同步,所以使用起来非常简单。libGod致力于为游戏、云计算等高并发服务器提供一个高性能而且简单易用...

libGod
2015/04/07
1K
4
高性能网络库 libGod-2.0.2-testing 发布

简介 libGod是一个全异步+协程机制实现的网络库,巧妙的利用协程,将复杂的异步逻辑转换为同步,所以使用起来非常简单。libGod致力于为游戏、云计算等高并发服务器提供一个高性能而且简单易用...

libGod
2014/12/30
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
29分钟前
10
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
57分钟前
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
58分钟前
7
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
今天
19
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部