int main() { struct sockaddr_in serv_addr, cli_addr; pthread_t thread; int addrlen; int iSetOption = 1; int * p_clientfd; int clilen = sizeof(cli_addr); (void) signal(SIGINT, exitServer); serverfd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (char *) &iSetOption, sizeof(iSetOption)); if(serverfd == 0) { perror("Error creating socket"); exitServer(EXIT_FAILURE); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(1324); if( bind(serverfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("Binding problem"); exitServer(EXIT_FAILURE); } if( listen(serverfd, 5) == -1) { perror("Listening problem"); exitServer(EXIT_FAILURE); } printf("Listening...\n"); addrlen = sizeof(serv_addr); while (1) { p_clientfd = malloc(sizeof(int)); *p_clientfd = accept(serverfd, (struct sockaddr *) &cli_addr, (socklen_t *) &clilen); pthread_create(&thread, NULL, &handle_http, p_clientfd); pthread_detach(thread); } return EXIT_SUCCESS; }
/* * server main loop - handles the users requests */ void ServerManager::run() { running = true; User* currUser = NULL; multiUserListener = NULL; long command = 0; string msg; while (running) { // Create listener if (multiUserListener != NULL) { delete (multiUserListener); } multiUserListener = new MultipleTCPSocketsListener(); // Convert User to Socket before adding to list map<string, TCPSocket*> toSocket; for (map<string,User*>::iterator biter = usersMap.begin(); biter != usersMap.end(); biter++) { toSocket[biter->first] = (biter->second->getSocket()); } // Add socket multiUserListener->addSockets(toSocket); // Listen to socket TCPSocket* readyPeer = multiUserListener->listenToSocket(2); if (!readyPeer){ continue; } // Found user from tcpsocket list for (map<string,User*>::iterator iter = usersMap.begin(); iter != usersMap.end(); iter++) { if (readyPeer == iter->second->getSocket()) { currUser = iter->second; break; } } // READ command from the user command = currUser->readCommand(); switch(command) { case 0: exitServer(currUser); break; case SESSION_CREATE: msg = currUser->readMsg(); // Partner name if (!usersMap[msg]) { currUser->writeCommand(SESSION_CREATE_REFUSED); currUser->writeMsg(string("No such user")); break; } else if (usersMap[msg]->inChat()) { currUser->writeCommand(SESSION_CREATE_REFUSED); currUser->writeMsg(string("The selected user is already in chat")); break; } createSession(currUser,usersMap[msg]); cout<<"Session was created between: "<<currUser->getusername()<<" AND "<<msg<<endl; break; case EXIT: exitServer(currUser); break; case SESSION_CLOSE: currUser->closeSession(true); break; case CHAT_ROOM_CREATE: createChatRoom(currUser); break; case CHAT_ROOM_CLOSE: deleteChatRoom(currUser); break; case CHAT_ROOM_LOGIN: loginChatRoom(currUser); break; case CHAT_ROOM_EXIT: currUser->disconnectFromChatRom(false); break; case LIST_CONNECTED_USERS: getListConnectedUsers(currUser); break; case LIST_ROOMS: getListRooms(currUser); break; case LIST_CONNECTED_USERS_IN_ROOM: getListChatUsers(currUser); break; case LIST_USERS: getListUsers(currUser); break; } } }