- 论坛徽章:
- 0
|
使用EPOLL , 的TCP服务器
生成俩个epoll fd , 一个用于接收,一个用于发送 ,这样做是否正确
我使用下面的模型时发生过两种异常情况:
1。因为我的Send函数是给其他消息处理线程调用的,会发生处理线程挂住的情况,但是过一段时间(1,2小时,没具体看)又恢复了,经过跟踪,应该是挂在 Send函数这里
2. 程序运行了几天后,很多新连接上来,接受处理完第一个包后,调用Send返回时,socket 就收到 input/output error 的错误,然后关闭了socket。但是有少部分连接可以成功
- epSendfd = epoll_create(1);
- epRecvfd = epoll_create(MAX_SOCKET_NUM);
- 每有一个新连接上来
- struct epoll_event ev;
- ev.data.fd=fd;
- ev.events=EPOLLIN|EPOLLET;
- epoll_ctl(epRecvfd,EPOLL_CTL_ADD,fd,&ev);
- 接收是一个接收线程完成,做的事情就是
- while(IsExit() == false)
- {
- int nfds=epoll_wait(epRecvfd,events,MAX_SOCKET_NUM,400);
- ....
- }
- 发送只是提供一个函数,给其他处理线程调用
- int CTTcpBase::Send(unsigned int id, const char* buffer, int length)
- {
- 。。。
- struct epoll_event ev,events[1];
- ev.data.fd=fd;
- ev.events=EPOLLOUT|EPOLLET;
- epoll_ctl(epSendfd,EPOLL_CTL_ADD,fd,&ev);
- int nfds=epoll_wait(epSendfd,events,1,400);
- ...
- ret = ::send(fd, buffer + write, length - write, 0);
- ...
- epoll_ctl(epSendfd,EPOLL_CTL_DEL,fd,&ev);
- }
复制代码
我想问问,当对于一个连接fd,同时发生
epoll_wait(epRecvfd,events,MAX_SOCKET_NUM,400);
和
epoll_wait(epSendfd,events,1,400);
会不会有问题
[ 本帖最后由 qinyd 于 2006-12-16 22:02 编辑 ] |
|