免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1242 | 回复: 3
打印 上一主题 下一主题

最近在做IM,请大家提点建议吧! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-26 21:44 |只看该作者 |倒序浏览
大家好:
     最近小弟对IM比较感兴趣,请大家帮忙提点建议!
     jabber的服务器端我看了,看后非常的郁闷,现在正在看Leader/Followers,现在的问题非常多!还请大家帮忙!小弟在这里多谢了!
     我打算使用,线程池配合POLL来处理SOCKET操作,但没做过LINUX下的项目,没有头绪,比如线程开多少个合适?如何处理大规模的连接(采用TCP/IP的连接方式).
    我的基本思路如下,如有什么不合适的地方,请各位大哥多多指正!
    Lt_User 类:处理用户信息及消息的接收和发送
   Lt_User_Manager类:管理所有的在线用户,使用deque<Lt_User>;来保存所有的在线用户,当接收到消息时,更消息结构中的接收登陆名,在deque<Lt_User>;查找该用户,并调用Lt_User类中的recv_message函数.
    Lt_Mysql类:处理所有的数据库操作,把常用的信息放到链表中,以减少对数据库的访问操作.
    Lt_Server类:SOCKET服务类,这个的问题最多,我的线程函数代码如下(未编译,只是思路):
    static poll_array[MAX_CLIENT];

static int CreatePollThread(void* arg)
{
    int maxi = 0;
    int connfd, nready, client;
   
    for(;
    {
        pthread_mutex_lock(&ollMutex);
        
        nready = poll(poll_array, maxi+1, 100);
        if(poll_array[0].revents & POLLRDNORM)
        {
            connfd = accept(m_socket, NULL, NULL);
            
            int i = 1;
            for(i=1; i<MAX_CLIENT; i++)
            {
                if(poll_array.fd <0)
                {
                    poll_array.fd = connfd;
                    pthread_mutex_unlock(&rocMutex);     
                    break;
                }      
            }
            
            if(i == MAX_CLIENT)
            {
                // 向连接的客户端发送错误消息
                pthread_mutex_unlock(&ollMutex);
                continue;
            }   
            
            poll_array.events = POLLRDNORM;
            
            if(i >; maxi)
                maxi = i;
            
            if( --nready<= 0)
                continue;   
        } // end if
        
        //check all client for data
        char* buffer = new char[BUFFER_SIZE];
        int sockfd;
        for(int i=1; i<maxi; i++)
        {
            if((sockfd = poll_array.fd) < 0)
                continue;
               
            if(poll_array.revents &(POLLRDNORM | POLLERR))
            {
                int n;
                if(n = recv(sockfd, buffer, sizeof(buffer)))
                {
                    // connection reset by client
                    if(erron == ECONNRESET)
                    {
                        close(sockfd);
                        poll_array.fd = -1;
                        // 从在线用户列表中删除该用户
                        pthread_mutex_lock(&UserMutex);
                        
                        
                        pthread_mutex_unlock(&UserMutex);
                    }
                }
                else if( n == 0) //connection close by client
                {
                    close(sockfd);
                    poll_array.fd = -1;
                    // 从在线用户列表中删除该用户
                    pthread_mutex_lock(&UserMutex);   
                    
                    pthread_mutex_unlock(&UserMutex);                    
                }   
                else
                {
                    //接收数据   
                }   
               
                if(--nready <= 0)
                    break;
            } // end if
        } // end for        
     }//end for
}

论坛徽章:
0
2 [报告]
发表于 2005-02-28 00:09 |只看该作者

最近在做IM,请大家提点建议吧!

如果仅仅基于Linux平台的,不考虑移植话,建议使用epoll代替poll,epoll是Linux下native的异步IO机制,效率最高。

论坛徽章:
0
3 [报告]
发表于 2005-02-28 10:47 |只看该作者

最近在做IM,请大家提点建议吧!

考滤移植的话,可以用ace 前摄器模式,是最快的,linux下用epoll实现,win下用完成端口实现
另:deque<Lt_User>;建议用hash_map或自己写个hash实现。或用vector,因为更新用户数据的操作很多,deque的话,每次都要遍历,要尽量在更新用户数据时在,一或两个语句里就搞定,这样子在多用户在线时,就更新数据很快

论坛徽章:
0
4 [报告]
发表于 2005-03-04 17:20 |只看该作者

最近在做IM,请大家提点建议吧!

多谢二位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP