理论
同一个 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)