Exemple #1
0
void ServerGame::receiveJoinPacket(int offset) {
	struct PacketHeader* hdr = (struct PacketHeader *) &(network_data[offset]);
	
	struct PacketData* dat = (struct PacketData *) &(network_data[offset + sizeof(PacketHeader)]);
	struct PosInfo* pi = (struct PosInfo *) &(dat->buf);

	printf("recieved join packet from %d for %d\n", hdr->sender_id, pi->team_id);

	int client = hdr->sender_id;

	if (team_map.find(client) == team_map.end()) { // if new client send all client team data
		for (std::map<int, int>::iterator it = team_map.begin(); it != team_map.end(); it++) {
			sendJoinPacket(it->first);
		}
	}
	
	printf("(before) team_map size = %d", team_map.size());
	team_map[client] = pi->team_id;
	printf("team_map size = %d", team_map.size());
	sendJoinPacket(client);
};
Exemple #2
0
int main(int argc, char ** argv) {
    if(argc != 4) {
        std::cerr << "usage: " << argv[0] << " server_name port user_name" << std::endl;
        exit(-1);
    }
    char * hostName = argv[1];
    int portNum = atoi(argv[2]);
    char * portNumStr = argv[2];
    char * userName = argv[3];

    if(portNum < 0 || portNum > 65535) {
        std::cerr << "error: port number must be between 0 and 65535" << std::endl;
        exit(-2);
    } 

    if(strnlen(userName, USERNAME_MAX+1) > USERNAME_MAX) {
        std::cerr << "error: username can be no longer than " << USERNAME_MAX << " characters" << std::endl;
        exit(-3);
    }

    struct addrinfo hints, *servinfo, *p;
    int status;
    int numbytes;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;
    status = getaddrinfo(hostName, portNumStr, &hints, &servinfo);

    if(status != 0) {
        std::cerr << "error: unable to resolve address: " << gai_strerror(status) << std::endl;
        exit(-4);
    }

    for(p = servinfo; p != NULL; p = p->ai_next) {
        sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
        if(sock == -1) {
            std::cerr << "warning: could not connect to socket" << std::endl;
            continue;
        }
        break;
    }

    if(p == NULL) {
        std::cerr << "error: all sockets failed to connect" << std::endl;
        exit(-5);
    }
	
	memset(curChannel, 0, CHANNEL_MAX);
	strncpy(curChannel, "Common", CHANNEL_MAX);
	channelsJoined.insert(curChannel);
	
	buf = (text *) malloc(MAX_BUFFER_SIZE);

    fcntl(sock, F_SETFL, O_NONBLOCK);

    sendLoginPacket(sock, p, userName);
    sendJoinPacket(sock, p, "Common");

    atexit(restoreTerminal);
    setupTerminal();

    line = new char[MAXLINE+1];
	memset(line, '\0', MAXLINE+1);

	clearInput();
    refreshAll();

	signal(SIGALRM, timerExpired);
	alarm(KEEP_ALIVE_FREQ);

    while(handleInput(sock, p)) {
    }

    sendLogoutPacket(sock, p);

    delete [] line; 
	free(buf);

    return 0;
}
Exemple #3
0
bool handleInput(int sock, struct addrinfo * p) {
    int charRead;
    while(true)  {
		if(timeForKeepAlive) {
			sendKeepAlivePacket(sock, p);
			timeForKeepAlive = false;
		}
		handleNetwork(sock, p);
        charRead = wgetch(inputWnd);        
        if(charRead == 127 && nchars > 0) {
            int cy, cx;
            getyx(inputWnd, cy, cx);
            mvwaddch(inputWnd, cy, cx-1, ' ');
			wmove(inputWnd, cy, cx-1);
            line[nchars] = '\0';
            --nchars;
            return true;
        } else if(charRead >= 32 && charRead <= 126 && nchars < MAXLINE) {
            wechochar(inputWnd, charRead);
            line[nchars] = charRead;
            refreshAll();
            ++nchars;
            return true;
        } else if(charRead == '\n') {
            if(strncmp(line, "/exit", std::max(nchars, MAXLINE+1)) == 0) {
                return false;
            } else if(strncmp(line, "/join ", 6) == 0) {
                sendJoinPacket(sock, p, &(line[6]));
				memset(curChannel, '\0', CHANNEL_MAX+1);
				strncpy(curChannel, &(line[6]), CHANNEL_MAX);
				channelsJoined.insert(curChannel);
			} else if(strncmp(line, "/switch ", 8) == 0) {
				char chanName[CHANNEL_MAX+1];
				memset(chanName, '\0', CHANNEL_MAX+1);
				strncpy(chanName, &(line[8]), CHANNEL_MAX);
				if(channelsJoined.count(chanName) > 0) {
					strncpy(curChannel, chanName, CHANNEL_MAX);
				} else {
					char err[256];
					snprintf(err, 256, "you have not subscribed to channel %.32s", chanName);
					printErrorMsg(err);
				}
            } else if(strncmp(line, "/leave ", 7) == 0) {
                sendLeavePacket(sock, p, &(line[7]));
				memset(curChannel, '\0', CHANNEL_MAX+1);
				strncpy(curChannel, &(line[7]), CHANNEL_MAX);
				channelsJoined.erase(curChannel);
				memset(curChannel, '\0', CHANNEL_MAX);
			} else if(strncmp(line, "/list", 5) == 0) {
				sendListPacket(sock, p);
			} else if(strncmp(line, "/who ", 5) == 0) {
				sendWhoPacket(sock, p, &(line[5]));
            } else if(line[0] == '/') {
				printErrorMsg("unrecognized command");
			} else if(curChannel[0] != '\0'){
				sendSayPacket(sock, p, curChannel, line);
			}
            //wprintw(wnd, "%s\n", line);
            memset(line, '\0', MAXLINE+1);
            clearInput();
            return true;
        }
    };
}