linux的异步事件处理--epoll

本文探讨了在socket编程中,通过Fork、Select和Epoll技术解决并发连接问题的方法,对比了它们的实现原理和优势,并提供了客户端与服务器示例代码。

在socket网络编程中,如果当前已经有连接了,那么另外一个请求想连接服务器,只能等待了。

因此解决的办法有下面4中。

 

fork的方式

这种方式很好理解,

代码如下

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8111
#define MESSAGE_SIZE 1024

int main(){

  int ret = -1;

  int pid;
  int socket_fd = -1;
  int accept_fd = -1;

  int curpos = 0;
  int backlog = 10;
  int flag = 1;

  struct sockaddr_in local_addr, remote_addr;

  //create a tcp socket
  socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  if ( socket_fd == -1 ){
    perror("create socket error");
    exit(1);
  }

  //set option of socket
  ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
  if ( ret == -1 ){
    perror("setsockopt error");
  }

  //set local address
  local_addr.sin_family = AF_INET;
  local_addr.sin_port = htons(PORT);
  local_addr.sin_addr.s_addr = INADDR_ANY;
  bzero(&(local_addr.sin_zero), 8);

  //bind socket
  ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
  if(ret == -1 ) {
    perror("bind error");
    exit(1);
  }

  ret = listen(socket_fd, backlog);
  if ( ret == -1 ){
    perror("listen error");
    exit(1);
  }

  for(;;){

    int addr_len = sizeof( struct sockaddr_in );

    //accept an new connection, block......
    accept_fd = accept( socket_fd, (struct sockaddr *)&remote_addr, &addr_len );

    //create a sub process
    pid = fork();

    //子进程
    if( pid==0 ){ 

      char in_buf[MESSAGE_SIZE] = {0,};

      for(;;){

        memset(in_buf, 0, MESSAGE_SIZE);

        ret = recv(accept_fd ,&in_buf, MESSAGE_SIZE, 0);
        if(ret == 0){
          break; 
        } 

        printf( "receive message:%s\n", in_buf );
        send(accept_fd, (void*)in_buf, MESSAGE_SIZE, 0);

      }

      printf("close client connection...\n");
      close(accept_fd);

    } 

    //parent process
    
  }

  if(pid != 0 ){
    printf("quit server...\n");
    close(socket_fd);
  }

  return 0;
}

select的方式

需要先了解异步IO,

使用select的例子,如下:

#include <stdio.h>
#include <uni
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值