#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;
}