ChatControl::ChatControl(ChatControlListener* listener): m_listener(listener), timeStamps(BOOLSETTING(TIME_STAMPS)), m_headerHeight(32), curCommandPosition(0), currentNeedlePos(-1), containerView(this, mapView), containerMessage(this, mapMessage), containerEmoticons(this, mapEmoticons) { initCommandMap(); }
void* main_loop (void* arg) { int srv_socket, tmp_socket; socklen_t cln_addr_size; struct sockaddr_in srv_addr, cln_addr; srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = INADDR_ANY; srv_addr.sin_port = htons (port); bzero (cln_sockets, connectionLimit * sizeof (int)); if ((srv_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror ("Main socket creation error:"); exit (EXIT_FAILURE); } if (bind (srv_socket, (struct sockaddr*) &srv_addr, sizeof srv_addr) == -1) { perror ("Main socket bind error:"); exit (EXIT_FAILURE); } if (listen (srv_socket, 16) == -1) { perror ("Main socket listen error:"); exit (EXIT_FAILURE); } printf ("Main socket started\n"); initCommandMap(); while (1) { cln_addr_size = sizeof cln_addr; if ((tmp_socket = accept (srv_socket, (struct sockaddr*) &cln_addr, &cln_addr_size)) == -1) { perror ("Main socket accept error:"); continue; } pthread_mutex_lock (&sock_mutex); unsigned i; for (i = 0; i < connectionLimit; i++) if (cln_sockets [i] == 0) { cln_sockets [i] = tmp_socket; break; } pthread_mutex_unlock (&sock_mutex); if (i == connectionLimit) { printf ("Too many connections\n"); close (tmp_socket); continue; } string ip(inet_ntoa(cln_addr.sin_addr)); pthread_mutex_lock (&ses_mutex); // create session ses.isAuthenticated = false; ses.csck = cln_sockets[i]; ses.currentDir.assign("./filesystem/"); ses.t = ASCII; ses.f = NON_PRINT; ses.m = NONE; ses.ip = ip; ses.clientPort = cln_addr.sin_port; if (pthread_create (&client_threads [i], NULL, client_loop, &ses) != 0) { pthread_mutex_unlock (&ses_mutex); printf ("Error creating new client thread\n"); continue; } } }