EPOLL及消息队列实现

#include "smtpd_mock.h"

char* strsub (char *instr, unsigned start, unsigned end)
{
 unsigned n = end - start;
 char * outstr = (char *)malloc(n+1);
 //bzero(outstr,n+1);
 strncpy (outstr, instr + start, n);
 outstr[n] = 0;
 return outstr;
}

int setnonblocking(int sockfd)
{
    if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
    {
        return -1;
    }
    return 0;
}

void smtp_echo(void* data)
{
 int socket = *(int*)data;
 char ebuf[128],buffer[BUFFER_SIZE];
 int length = 0, z;
 regex_t reg;
  regmatch_t pm[10];
  const size_t nmatch = 10;
 const char * split = "/r/n";
 char * pline, * cmd;
 
 z = regcomp (&reg, smtp_cmd_format, REG_EXTENDED);
 if (z != 0){
  regerror (z,&reg, ebuf, sizeof (ebuf));
  fprintf (stderr, "%s: regcomp()/n", ebuf);
  return;
     }

 { 
  while (1) { 
      bzero(buffer,BUFFER_SIZE);
       length = recv(socket,buffer,BUFFER_SIZE,0);
      if (length == -1) { 
        if(errno == EAGAIN){
            break;
    }
         syslog(LOG_ERR,"recv - %m"); 
         break; 
      } 
      syslog(LOG_DEBUG,"%s",buffer);

   pline = strtok (buffer,split); 
   while(pline!=NULL) {
    syslog(LOG_DEBUG,"%s/n",pline);
    if (0==(strcasecmp(pline, "."))){
     smtp_cmd("HELO");
                       continue;
                  }
    z = regexec (&reg, pline, nmatch, pm, 0);
    if (z == REG_NOMATCH)
    {
     // do nothing;
    }
    else if (z != 0)
    {
     regerror (z,&reg, ebuf, sizeof (ebuf));
     fprintf (stderr, "%s: regexec('%s')/n", ebuf, pline);
     return ;
    }

    if(pm[1].rm_so != -1)
    {
     cmd = strsub (pline, pm[1].rm_so, pm[1].rm_eo);
     syslog(LOG_NOTICE,"cmd => %s/n", cmd);
     if(pm[2].rm_so != -1)
     {
      syslog(LOG_NOTICE,"other content => %s/n", strsub (pline, pm[2].rm_so, pm[2].rm_eo));
     }
     
     smtp_cmd(cmd,socket);
    }
    pline = strtok(NULL,split);
   }
   
   if(length < BUFFER_SIZE)
                         break;
  }

 } 
 
 regfree (&reg);
 return;
}

void smtp_cmd(char * cmd,int socket)

 char buffer[BUFFER_SIZE];
 bzero(buffer, BUFFER_SIZE);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现高并发的epoll线程池中,有几种常见的设计方法可以选择。其中,单线程epoll、多线程epoll和多进程epoll是常见的三种方法。 在单线程epoll中,所有的IO事件都在同一个线程中处理。这种方法适用于并发量不高的场景,因为只有一个线程负责处理所有的事件,可能会成为性能瓶颈。 多线程epoll方法是将IO事件的处理分配给多个线程,每个线程负责处理一部分事件。这种方法可以提高并发处理能力,但需要考虑线程间的同步和资源竞争问题。 另一种方法是多进程epoll,将IO事件的处理分配给多个进程,每个进程负责处理一部分事件。这样可以利用多核CPU的优势,提高并发处理能力。但需要注意进程间通信的开销和资源占用。 无论使用哪种方法,都需要注意合理调整epoll池的大小,以适应实际的并发情况。可以使用epoll_create函数创建epoll池,并根据需要调整其大小。 此外,在epoll线程池的设计中,还需要考虑管理就绪队列中的epoll结构体,每个注册到epoll池的文件描述符都会对应一个epitem结构体。这个结构体中记录了文件描述符的相关信息,如事件类型和回调函数等。 综上所述,通过选择适当的epoll线程池设计方法,并合理调整epoll池的大小,可以实现高并发处理能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [高并发高吞吐IO秘密武器——epoll池化技术](https://blog.csdn.net/qq_40989769/article/details/130310209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值