예제 #1
0
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;
}
예제 #2
0
/*
 * 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;
		}
	}
}