#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <map>
#include <queue>
#include <pqxx/pqxx>
#define MAXBUF 1024
#define MSG_RECIVED 0
#define MSG_NEEDMORE 1
#define MSG_ERROR -1
//receive msg
int handle_message(int new_fd)
{
char buf[MAXBUF];
int len;
bzero(buf, MAXBUF);
len = recv(new_fd, buf, MAXBUF, 0);
int ret = MSG_ERROR;
if (len > 0){
if(len == 1024){
char tag = buf[1024];
if(tag == 1)
ret = MSG_NEEDMORE;
if(tag == 0)
ret = MSG_RECIVED;
else
ret = MSG_ERROR;
}else
ret = MSG_RECIVED;
if(ret != MSG_ERROR){
map<int, iostream*>::iterator iter;
iter = connectionbuf.find(new_fd);
if(iter != connectionbuf.end()){
iter->second->write(buf, len);
if(ret == MSG_RECIVED)
iter->second->flush();
}else{
ret = MSG_ERROR;
}
}
}
return ret;
}
int main(int argc, char *argv[])
{
int listener, new_fd, kdpfd, nfds, n, curfds;
socklen_t len;
struct sockaddr_in my_addr, their_addr;
struct rlimit rt;
unsigned int myport, lisnum;
myport = 4523;
lisnum = 2;
struct epoll_event ev;
struct epoll_event events[MAXEPOLLSIZE];
struct protoent *ptent = getprotobyname("tcp");
/*寮€鍚痵ocket 鐩戝惉*/
if ((listener = socket(PF_INET, SOCK_STREAM, ptent->p_proto)) == -1)
{
perror("socket create error!\n");
exit(1);
}
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons(myport);
my_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind error!\n");
exit(1);
}
if (listen(listener, lisnum) == -1)
{
perror("listen error!\n");
exit(1);
}
else
{
printf("Start socket listen server success!\n");
}
/*鍒涘缓 epoll 鍙ユ焺锛屾妸鐩戝惉 socket 鍔犲叆鍒?epoll 闆嗗悎閲?/
kdpfd = epoll_create(MAXEPOLLSIZE);
len = sizeof(struct sockaddr_in);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = listener;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)
{
fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
return -1;
}
curfds = 1;
while (1)
{
/*绛夊緟鏈変簨浠跺彂鐢?/
nfds = epoll_wait(kdpfd, events, curfds, -1);//鎸囧畾涓€涓秴鏃舵椂闂?00
if (nfds == -1)
{
if (errno == EINTR){
continue;
}
perror("epoll_wait error!\n");
break;
}
/*澶勭悊浜嬩欢*/
for (n = 0; n < nfds; ++n)
{
if (events[n].data.fd == listener)
{
/*鍒涘缓 epoll 鍙ユ焺锛屾妸鐩戝惉 socket 鍔犲叆鍒?epoll 闆嗗悎閲?/
kdpfd = epoll_create(MAXEPOLLSIZE);
len = sizeof(struct sockaddr_in);
ev.events = EPOLLIN | EPOLLET;
ev.data.ptr = ConnectionManager::GetInstance()->OnSocketConnectec(fd);
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)
{
fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
return -1;
}
}
else{
SocketHolder* holderPtr = static_cast<SocketHolder*>(events[n].data.ptr);
s_revbuffers.find(holderPtr)->second.push();
if(holder->ok){
s_messagebuffers.push(MessageHolder*)
holderPtr->OnMessageRecived();
}
}
}
}
}