#if 1
while(1)
{
/* init file describle */
FD_ZERO(&rset);
FD_SET(listenfd, &rset);
/* set timeout */
timeout.tv_sec = 10;
timeout.tv_usec = 0;
/* add active connection to client[] */
for(i = 0; i < BACKLOG; i++) {
if(client[i])
{
FD_SET(client[i], &rset);
maxfd = maxfd > client[i] ? maxfd : client[i];
}
}
/* select */
ret = select(maxfd +1, &rset, NULL, NULL, NULL);
if(ret < 0) {
MY_DEBUG("%s,%d: select error\n\r",__func__,__LINE__);
goto EXIT;
}else if(!ret){
MY_DEBUG("%s,%d: select...\n\r",__func__,__LINE__);
continue;
}
/* check every fd in client[] by set */
// for(i = 0; i < conn_cout; i++) {
for(i = 0; i < BACKLOG; i++) {
/* if client[i] < 0 ,don't check */
if(client[i] >= 0) {
/* check client[]*/
if(FD_ISSET(client[i], &rset)) {
ret = do_recv_msg(client[i]);
if(ret < 0) {
MY_DEBUG("%s,%d: do recv faild !\n\r",__func__,__LINE__);
if(client[i])
lwip_close(client[i]);
FD_CLR(client[i], &rset);
// client[i] = 0;
client[i] = -1;
conn_cout--; //TODO...
MY_DEBUG("_______ conn_cout = %d\n", conn_cout);
}
}
}
} /* for() check client[] */
/* check listen fd by set or not */
if(FD_ISSET(listenfd, &rset)) {
confd = accept(listenfd, (struct sockaddr *)&client_addr, &sin_size); /* accept */
if(confd < 0) {
MY_DEBUG("%s,%d: No new connect..\n\r",__func__,__LINE__);
continue;
}
/* add new connection to client[] */
if(conn_cout < BACKLOG) {
MY_DEBUG("%s,%d: add new connection to client[]..\n\r",__func__,__LINE__);
/* set sockfd*/
// setsockopt(confd, SOL_SOCKET, SO_REUSEADDR,(const char*)&sock_reuse, sizeof(sock_reuse));
// setsockopt(confd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));
//TODO...
/* nonbloking */
// lwip_ioctl(confd, FIONBIO, &k);
for(i = 0; i < BACKLOG; i++) {
if(client[i] < 0) {
client[i] = confd;
break ;
}
}
conn_cout++;
MY_DEBUG("-----------------conn_cout = %d\n ", conn_cout);
// client[conn_cout++] = confd;
/* replace select maxfd by confd */
if(confd > maxfd)
maxfd = confd;
}else {
// MY_DEBUG("%s,%d: more user connect.. server will rester..\n\r",__func__,__LINE__);
MY_DEBUG("%s,%d: more user connect.. zero all connect..\n\r",__func__,__LINE__);
for(i = 0; i < BACKLOG; i++) {
if(client[i] >= 0) {
lwip_close(client[i]);
FD_CLR(client[i], &rset);
client[i] = -1;
}
// goto EXIT;
}
conn_cout = 0;
continue ;
// lwip_close(confd);
// break;
}
}
}
#endif /*end while*/