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); };
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; }
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; } }; }