Linux下网络编程(select/poll/epoll)

#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <unistd.h>
#include <poll.h>
#include <sys/epoll.h> 

#define  SERV_PORT    5060
#define  SERVER_IP    "192.168.2.35"
#define  MAX                2
#define  USE_SELECT
#define  USE_POLL

int readfd = 0;
int creat_udp_socket();


int main(int argc, char **argv)
{
    struct sockaddr_in cliaddr;                /* IPv4套接口地址定义*/
    int addr_len = sizeof(struct sockaddr_in);
    char recvbuff[600] = {0};
    int lenth = 0;
    fd_set rfds;
      struct timeval tv;
      int retval;
    int count = 0;
    
    if( creat_udp_socket() != NULL )    
    {
        printf("creat_udp_socket error! ");
        return 0;
    }
    
    printf("readfd:%d ",readfd);

/************** epoll举例  ****************/
#if 1
    int epfd;
    int nfds = 0;
    int loop = 0;
    struct epoll_event ev;
    struct epoll_event events[MAX];
    
    epfd = epoll_create(MAX);
      
    if( epfd < 0 ) 
    {
        printf("epoll_create error! ");
        return 0;
    }
    
    /*ev.events = EPOLLIN|EPOLLET;*/
    
    /* 监听读事件 */
    ev.events = EPOLLIN;
    /* 设置监听的句柄 */
    ev.data.fd = readfd;
    
    /* 注册epoll事件 */
      epoll_ctl(epfd,EPOLL_CTL_ADD,readfd,&ev);  
  
      while(1)
      {
        /* 等待epoll事件的发生 */  
            nfds=epoll_wait(epfd, events, 200, -1);
    
            /* 如果没有数据可读,相当与轮询,将会消耗大量的CPU资源 */
          nfds = epoll_wait(epfd, events, 200, 0);
            /* 处理所发生的所有事件 */       
            for( loop = 0; loop < nfds; loop++ )
            {
                if( events[loop].events & EPOLLIN )
                {
                    lenth = recvfrom (events[loop].data.fd, recvbuff, sizeof(recvbuff), 0, (struct sockaddr *)&cliaddr, &addr_len);
              
                  if (lenth <= 0 )
                  {
                      printf("receve data errer! ");
                  }
              
                  /*printf("%s",recvbuff);*/
                  printf("%d ",count++);
                }
            }
            /*sleep(1);*/

      }
      close(readfd);
      close(epfd);
#endif 
  
/************** poll举例  ****************/  
#if 0    
    struct pollfd poll_list[MAX];
    int loop = 0;
    
    for( loop = 0; loop < MAX; loop++ )
    {
        poll_list[loop].fd = -1;
        poll_list[loop].events = NULL;
    }
    
    poll_list[0].fd = readfd;
    poll_list[0].events = POLLIN;

    
    while(1)
    {
        retval = poll(poll_list,MAX,-1);
        
        if( retval > 0 )
        {
            if( poll_list[0].revents & POLLIN )
            {
                lenth = recvfrom (readfd,recvbuff,sizeof(recvbuff),0,(struct sockaddr *)&cliaddr,&addr_len);
              
              if (lenth <= 0 )
              {
                  printf("receve data errer! ");
              }
              /*printf("%s",recvbuff);*/
              printf("%d ",count++);

            }
        }
        sleep(1);
    }
#endif

/************** select举例  ****************/  
#if 0
    while(1)
    {
        /* Watch stdin (fd 0) to see when it has input. */
          FD_ZERO(&rfds);
          FD_SET(readfd, &rfds);
      
          /* Wait up to five seconds. */
          tv.tv_sec = 200;
          tv.tv_usec = 0;
      
          /*retval = select (FD_SETSIZE, &rfds, NULL, NULL, &tv);*/
          /*retval = select (FD_SETSIZE, &rfds, NULL, NULL, NULL);*/
          retval = select (readfd+1, &rfds, NULL, NULL, NULL);
      
          if( retval > 0 )
          {
              if( FD_ISSET(readfd, &rfds) )
              {
                  lenth = recvfrom (readfd,recvbuff,sizeof(recvbuff),0,(struct sockaddr *)&cliaddr,&addr_len);
              
                  if (lenth <= 0 )
                  {
                      printf("receve data errer! ");
                  }
                  /*printf("%s",recvbuff);*/
                  printf("%d ",count++);
              }
          
          }
      
    }

#endif 

/*
    while(1)
    {
        lenth = recvfrom (readfd,recvbuff,sizeof(recvbuff),0,(struct sockaddr *)&cliaddr,&addr_len);
        if (lenth <= 0 )
        {
            printf("receve data errer! ");
        }
        else
        {
            printf ("recever string: %s",recvbuff);
        }
    }
    
    sleep(20);
*/

    return 0;

}

int creat_udp_socket()
{
    struct sockaddr_in servaddr, cliaddr;                /* IPv4套接口地址定义*/
    int addr_len = sizeof(struct sockaddr_in);
    bzero(&servaddr, sizeof(servaddr));                  /* 地址结构清零 */
    servaddr.sin_family = AF_INET;                       /* IPv4协议 */
    /*servaddr.sin_addr.s_addr = inet_addr (SERVER_IP);*/    /* 指定地址 */
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(SERV_PORT);           


    readfd = socket (AF_INET, SOCK_DGRAM, 0);            /* 建立UDP套接字*/
    if(readfd < 0)
    {
        printf("socket errer! ");
        return -1;
    }
    /*分配协议地址,绑定端口*/
    
    if( bind(readfd, (struct sockaddr *)&servaddr, sizeof (struct sockaddr_in)) == -1 )
    {
        printf("bind errer! ");
        return -1;
    }
    return 0;
}


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值