epoll高级应用之同时处理 tcp/udp 的服务器

理论

同一个 ip+port可以同时的被tcp模块使用也可以同时被udp模块使用。它可以同时处理来自不同运输层协议的请求。当不同的数据到达时,应用只需在不同的缓存队列中读取数据即可。

这里写图片描述

/*server*/
#include<stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<assert.h>
#include<netinet/in.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
#include<sys/epoll.h>
#include<pthread.h>


#define EVENT_LENGTH 1024
#define TCP_BUFFER 1024
#define UDP_BUFFER 1024

int setnonblock(int fd)
{
    int old_option=fcntl(fd,F_GETFL);
   int new_option=old_option|O_NONBLOCK;
   fcntl(fd,F_SETFL,new_option);
   return fd;
}
void add_event(int epoll_fd,int fd)
{
   struct  epoll_event event;
     event.events=EPOLLIN|EPOLLET;
     event.data.fd=fd;
     epoll_ctl(epoll_fd,EPOLL_CTL_ADD,fd,&event);
     setnonblock(fd);
}
int startup(char * ip,char *port)
{
   int listen_sock=0;
   if((listen_sock=socket(AF_INET,SOCK_STREAM,0))<0)
    {
          perror("listen");
          exit(1);
    }
        }
  struct sockaddr_in address;
   bzero(&address,sizeof(address));
   address.sin_family=AF_INET;
   address.sin_port=htons(atoi(port));
   int ret=0;
   if((ret=inet_pton(AF_INET,ip,&address.sin_addr))==0)
    {
       printf(" ip ge shi cuowu\n");
       exit(2);
    }
   else if(ret<0)
    {
       perror("inet_pton");
       exit(3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值