- 论坛徽章:
- 0
|
大家好:
最近小弟对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
} |
|