日期:2014-05-16  浏览次数:20662 次

linux底下epoll模型服务端写数据到客户端?
本帖最后由 VisualEleven 于 2012-10-08 21:25:51 编辑
#include <iostream>
#include <sys/epoll.h>
#include <time.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdarg.h>
using namespace std;

#define MAX_CONNECTED_NO 6
#define BUF_SIZE 512
#define LISTEN_PORT 10000
#define LOCAL_IP 127.0.0.1
#define MAX_EVENTS 5
#define ERR_EXIT(m) do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while(0)

int main()
{
int clientArry[20];
for (int i = 0; i < 20; i++)
{
clientArry[i] = -1;
}
char acReadBuf[BUF_SIZE] = {0};
char acWriteBuf[BUF_SIZE] = {0};
int listenFd = socket(AF_INET, SOCK_STREAM, 0);
if(listenFd == -1)
{
ERR_EXIT("创建监听端口失败!\n");
}

int clientFd = -1;
struct sockaddr_in serverAddr;
memset(&serverAddr, 0x00, sizeof(struct sockaddr_in));

struct sockaddr_in clientAddr;
memset(&clientAddr, 0x00, sizeof(struct sockaddr_in));

socklen_t addrlen;

//初始化服务端套接字结构体
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(LISTEN_PORT);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

//设置端口复用
int yes = 1;
int rlt = setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
if(rlt == -1)
{
ERR_EXIT("设置端口复用失败!\n");
}

//1.2非阻塞模式
int flags = fcntl(listenFd, F_GETFL);
fcntl(listenFd, F_SETFL, flags| O_NONBLOCK);

//绑定
rlt = bind(listenFd, (struct sockaddr *)(&serverAddr), sizeof(struct sockaddr_in));
if(rlt == -1)
{
ERR_EXIT("绑定失败!\n");
}

//监听
rlt = listen(listenFd, 5);
if(rlt == -1)
{
ERR_EXIT("监听失败!\n");
}

//声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
    struct epoll_event  ev;
    struct epoll_event   events[20];
    //生成用于处理accept的epoll专用的文件描述符
    int epfd=epoll_create(256);

//注册监听的事件
ev.data.fd = listenFd;
  ev.events=EPOLLIN|EPOLLET|EPOLLOUT;

rlt = epoll_ctl(epfd, EPOLL_CTL_ADD, listenFd, &ev);
if(rlt == -1)
{
ERR_EXIT("注册事件失败!\n");

}
struct timeval outtime;
memset(&outtime, 0x00, sizeof(struct timeval));

while(true)
{
outtime.tv_sec = 10;