const char *GetMODVersion(void) { static msg_t msg; // we must be connected to the master server before writing to it if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0)) { CONS_Printf("cannot connect to the master server\n"); M_StartMessage("There was a problem connecting to\nthe Master Server", NULL, MM_NOTHING); return NULL; } msg.type = GET_VERSION_MSG; msg.length = sizeof MODVERSION; msg.room = MODID; // Might as well use it for something. sprintf(msg.buffer,"%d",MODVERSION); if (MS_Write(&msg) < 0) return NULL; MS_Read(&msg); CloseConnection(); if(strcmp(msg.buffer,"NULL") != 0) { return msg.buffer; } else return NULL; }
void MSOpenUDPSocket(void) { #ifndef NONET if (I_NetMakeNode) { // If it's already open, there's nothing to do. if (msnode < 0) { char hostname[24]; MS_GetIP(GetMasterServerIP()); sprintf(hostname, "%s:%d", #ifdef _arch_dreamcast inet_ntoa(*(UINT32 *)&addr.sin_addr), #else inet_ntoa(addr.sin_addr), #endif atoi(GetMasterServerPort())+1); msnode = I_NetMakeNode(hostname); } } else #endif msnode = -1; }
void RegisterServer(void) { if (con_state == MSCS_REGISTERED || con_state == MSCS_WAITING) return; CONS_Printf("Registering this server to the master server...\n"); strcpy(registered_server.ip, GetMasterServerIP()); strcpy(registered_server.port, GetMasterServerPort()); if (MS_Connect(registered_server.ip, registered_server.port, 1)) { CONS_Printf("cannot connect to the master server\n"); return; } MSOpenUDPSocket(); // keep the TCP connection open until AddToMasterServer() is completed; }
const msg_server_t *GetShortServersList(INT32 room) { static msg_server_t server_list[NUM_LIST_SERVER+1]; // +1 for easy test msg_t msg; INT32 i; // updated now oldroomnum = room; // we must be connected to the master server before writing to it if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0)) { CONS_Printf("cannot connect to the master server\n"); M_StartMessage("There was a problem connecting to\nthe Master Server", NULL, MM_NOTHING); return NULL; } msg.type = GET_SHORT_SERVER_MSG; msg.length = 0; msg.room = room; if (MS_Write(&msg) < 0) return NULL; for (i = 0; i < NUM_LIST_SERVER && MS_Read(&msg) >= 0; i++) { if (!msg.length) { server_list[i].header.buffer[0] = 0; CloseConnection(); return server_list; } M_Memcpy(&server_list[i], msg.buffer, sizeof (msg_server_t)); server_list[i].header.buffer[0] = 1; } CloseConnection(); if (i == NUM_LIST_SERVER) { server_list[i].header.buffer[0] = 0; return server_list; } else return NULL; }
/** Gets a list of game servers. Called from console. */ static void Command_Listserv_f(void) { if (con_state == MSCS_WAITING) { CONS_Printf("Not yet registered to the master server.\n"); return; } CONS_Printf("Retrieving server list...\n"); if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0)) { CONS_Printf("cannot connect to the master server\n"); return; } if (GetServersList()) CONS_Printf("cannot get server list\n"); CloseConnection(); }
void MSOpenUDPSocket(void) { #ifndef NONET if (I_NetMakeNode) { // If it's already open, there's nothing to do. if (msnode < 0) { const char *mshost = GetMasterServerIP(); const char *msport = GetMasterServerPort(); size_t len = strlen(mshost)+1+strlen(msport)+1; /*hostname:65536*/ char *hostname = malloc(len); sprintf(hostname, "%s:%s", mshost, msport); msnode = I_NetMakeNode(hostname); free(hostname); } } else #endif msnode = -1; }
/** Tries to register the local game server on the master server. */ static INT32 AddToMasterServer(boolean firstadd) { #ifdef NONET (void)firstadd; #else static INT32 retry = 0; int i, res; socklen_t j; msg_t msg; msg_server_t *info = (msg_server_t *)msg.buffer; INT32 room = -1; fd_set tset; time_t timestamp = time(NULL); UINT32 signature, tmp; const char *insname; M_Memcpy(&tset, &wset, sizeof (tset)); res = select(255, NULL, &tset, NULL, &select_timeout); if (res != ERRSOCKET && !res) { if (retry++ > 30) // an about 30 second timeout { retry = 0; CONS_Printf("Timeout on masterserver\n"); MSLastPing = timestamp; return ConnectionFailed(); } return MS_CONNECT_ERROR; } retry = 0; if (res == ERRSOCKET) { if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0)) { CONS_Printf("Mastserver error on select #%u: %s\n", errno, strerror(errno)); MSLastPing = timestamp; return ConnectionFailed(); } } // so, the socket is writable, but what does that mean, that the connection is // ok, or bad... let see that! j = (socklen_t)sizeof (i); getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j); if (i) // it was bad { CONS_Printf("Masterserver getsockopt error #%u: %s\n", errno, strerror(errno)); MSLastPing = timestamp; return ConnectionFailed(); } if (dedicated && (M_CheckParm("-room") && M_IsNextParm())) { room = atoi(M_GetNextParm()); if(room == 0) room = -1; } else if(dedicated) room = -1; else room = cv_chooseroom.value; for(signature = 0, insname = cv_servername.string; *insname; signature += *insname++); tmp = (UINT32)(signature * (size_t)&MSLastPing); signature *= tmp; signature &= 0xAAAAAAAA; M_Memcpy(&info->header.signature, &signature, sizeof (UINT32)); strcpy(info->ip, ""); strcpy(info->port, int2str(current_port)); strcpy(info->name, cv_servername.string); M_Memcpy(&info->room, & room, sizeof (INT32)); sprintf(info->version, "%d.%d.%d", VERSION/100, VERSION%100, SUBVERSION); strcpy(registered_server.name, cv_servername.string); if(firstadd) msg.type = ADD_SERVER_MSG; else msg.type = PING_SERVER_MSG; msg.length = (UINT32)sizeof (msg_server_t); msg.room = 0; if (MS_Write(&msg) < 0) { MSLastPing = timestamp; return ConnectionFailed(); } if(con_state != MSCS_REGISTERED) CONS_Printf("Master Server Updated Successfully!\n"); MSLastPing = timestamp; con_state = MSCS_REGISTERED; CloseConnection(); #endif return MS_NO_ERROR; }
INT32 GetRoomsList(boolean hosting) { static msg_ban_t banned_info[1]; msg_t msg; INT32 i; // we must be connected to the master server before writing to it if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0)) { CONS_Printf("cannot connect to the master server\n"); M_StartMessage("There was a problem connecting to\nthe Master Server", NULL, MM_NOTHING); return -1; } if (hosting) msg.type = GET_ROOMS_HOST_MSG; else msg.type = GET_ROOMS_MSG; msg.length = 0; msg.room = 0; if (MS_Write(&msg) < 0) { room_list[0].id = 1; strcpy(room_list[0].motd,"Master Server Offline."); strcpy(room_list[0].name,"Offline"); return -1; } for (i = 0; i < NUM_LIST_ROOMS && MS_Read(&msg) >= 0; i++) { if(msg.type == GET_BANNED_MSG) { char banmsg[1000]; M_Memcpy(&banned_info[0], msg.buffer, sizeof (msg_ban_t)); if (hosting) sprintf(banmsg, "You have been banned from\nhosting netgames.\n\nUnder the following IP Range:\n%s - %s\n\nFor the following reason:\n%s\n\nYour ban will expire on:\n%s",banned_info[0].ipstart,banned_info[0].ipend,banned_info[0].reason,banned_info[0].endstamp); else sprintf(banmsg, "You have been banned from\njoining netgames.\n\nUnder the following IP Range:\n%s - %s\n\nFor the following reason:\n%s\n\nYour ban will expire on:\n%s",banned_info[0].ipstart,banned_info[0].ipend,banned_info[0].reason,banned_info[0].endstamp); M_StartMessage(banmsg, NULL, MM_NOTHING); cv_internetserver.value = false; return -2; } if (!msg.length) { room_list[i].header.buffer[0] = 0; CloseConnection(); return 1; } M_Memcpy(&room_list[i], msg.buffer, sizeof (msg_rooms_t)); room_list[i].header.buffer[0] = 1; } CloseConnection(); if (i == NUM_LIST_ROOMS) { room_list[i].header.buffer[0] = 0; return 1; } else { room_list[0].id = 1; strcpy(room_list[0].motd,"Master Server Offline."); strcpy(room_list[0].name,"Offline"); return -1; } }