📄 mserv.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: mserv.c,v 1.29 2001/03/03 19:44:50 ydario Exp $//// Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.////// $Log: mserv.c,v $// Revision 1.29 2001/03/03 19:44:50 ydario// Added OS/2 headers//// Revision 1.28 2001/02/24 13:35:20 bpereira// no message//// Revision 1.27 2001/02/16 01:17:55 hurdler// No need to convert msg->id//// Revision 1.26 2001/02/16 00:45:07 hurdler// Better solution//// Revision 1.25 2001/01/11 01:15:57 hurdler// Fix Little/Big Endian issue//// Revision 1.24 2001/01/05 18:17:43 hurdler// fix master server bug//// Revision 1.23 2000/11/26 00:46:31 hurdler// small bug fixes//// Revision 1.22 2000/10/22 00:38:22 hurdler// Fix %s to %d in version string//// Revision 1.21 2000/10/22 00:20:53 hurdler// Updated for the latest master server code//// Revision 1.20 2000/10/21 23:21:56 hurdler// Minor updates//// Revision 1.19 2000/10/21 08:43:29 bpereira// no message//// Revision 1.18 2000/10/17 10:09:27 hurdler// Update master server code for easy connect from menu//// Revision 1.17 2000/10/16 20:02:29 bpereira// no message//// Revision 1.16 2000/10/08 13:30:01 bpereira// no message//// Revision 1.15 2000/10/07 18:36:50 hurdler// fix a bug with Win2k//// Revision 1.14 2000/10/01 15:20:23 hurdler// Add private server//// Revision 1.13 2000/09/14 10:39:59 hurdler// Fix compiling problem under win32//// Revision 1.12 2000/09/10 10:45:14 metzgermeister// *** empty log message ***//// Revision 1.11 2000/09/08 22:28:30 hurdler// merge masterserver_ip/port in one cvar, add -private//// Revision 1.10 2000/09/02 15:38:24 hurdler// Add master server to menus (temporaray)//// Revision 1.9 2000/09/01 18:23:42 hurdler// fix some issues with latest network code changes//// Revision 1.8 2000/08/29 15:53:47 hurdler// Remove master server connect timeout on LAN (not connected to Internet)//// Revision 1.7 2000/08/21 12:44:45 hurdler// fix SOCKET not defined under some OS//// Revision 1.6 2000/08/21 11:06:44 hurdler// Add ping and some fixes//// Revision 1.5 2000/08/16 23:39:41 hurdler// fix a bug with windows sockets//// Revision 1.4 2000/08/16 17:21:50 hurdler// update master server code (bis)//// Revision 1.3 2000/08/16 16:24:45 ydario// OS/2 also needs inet_aton//// Revision 1.2 2000/08/16 15:44:18 hurdler// update master server code//// Revision 1.1 2000/08/16 14:04:57 hurdler// add master server code//////// DESCRIPTION:// Commands used for communicate with the master server////-----------------------------------------------------------------------------#ifdef WIN32#include <windows.h> // socket(),...#else#include <unistd.h>#ifdef __OS2__#include <sys/types.h>#endif#include <sys/socket.h> // socket(),...#include <sys/time.h> // timeval,... (TIMEOUT)#include <netinet/in.h> // sockaddr_in#include <arpa/inet.h> // inet_addr(),...#include <netdb.h> // gethostbyname(),...#include <sys/ioctl.h>#include <errno.h>/*#include <string.h> // memset(),...#include <sys/types.h> // socket(),...*/#endif#ifdef __OS2__#include <errno.h>#endif#include "doomdef.h"#include "command.h"#include "console.h"#include "mserv.h"#include "i_tcp.h"#include "i_net.h"#include "i_system.h"#include "d_clisrv.h"// ================================ DEFINITIONS ===============================#define PACKET_SIZE 1024#define MS_NO_ERROR 0#define MS_SOCKET_ERROR -201#define MS_CONNECT_ERROR -203#define MS_WRITE_ERROR -210#define MS_READ_ERROR -211#define MS_CLOSE_ERROR -212#define MS_GETHOSTBYNAME_ERROR -220#define MS_GETHOSTNAME_ERROR -221#define MS_TIMEOUT_ERROR -231// see master server code for the values#define ADD_SERVER_MSG 101#define REMOVE_SERVER_MSG 103#define GET_SERVER_MSG 200#define GET_SHORT_SERVER_MSG 205#define HEADER_SIZE ((long)sizeof(long)*3)#define HEADER_MSG_POS 0#define IP_MSG_POS 16#define PORT_MSG_POS 32#define HOSTNAME_MSG_POS 40#ifndef SOCKET#define SOCKET int#endiftypedef struct { long id; long type; long length; char buffer[PACKET_SIZE];} msg_t;struct Copy_CVarMS_t{ char ip[64]; char port[8]; char name[64];} registered_server;// win32 or djgpp#if defined( WIN32) || defined( __DJGPP__ ) #define ioctl ioctlsocket#define close closesocket#endif#if defined( WIN32) || defined( __OS2__)// it seems windows doesn't define that... maybe some other OS? OS/2int inet_aton(char *hostname, struct in_addr *addr){ return ( (addr->s_addr=inet_addr(hostname)) != INADDR_NONE );} #endifstatic void Command_Listserv_f(void);//TODO: when we change the port or ip, unregister to the old master server, register to the new one#define DEF_PORT "28910"consvar_t cv_internetserver= {"internetserver", "No", CV_SAVE, CV_YesNo };consvar_t cv_masterserver = {"masterserver", "doomlegacy.dhs.org:28910", CV_SAVE, NULL };consvar_t cv_servername = {"servername", "DooM Legacy server", CV_SAVE, NULL };enum { MSCS_NONE, MSCS_WAITING, MSCS_REGISTERED, MSCS_FAILED } con_state = MSCS_NONE;#define NEWCODE#ifndef NEWCODEstatic SOCKET mysocket; // UDP socketstatic int current_port;static struct sockaddr_in udp_addr;#elsestatic int msnode=-1;#define current_port sock_port#endifstatic SOCKET socket_fd = -1; // TCP/IP socketstatic struct sockaddr_in addr;static struct timeval select_timeout;static fd_set wset;static int MS_Connect(char *ip_addr, char *str_port, int async);static int MS_Read(msg_t *msg);static int MS_Write(msg_t *msg);static int MS_GetIP(char *);void AddMServCommands(void){ CV_RegisterVar(&cv_internetserver); CV_RegisterVar(&cv_masterserver); CV_RegisterVar(&cv_servername); COM_AddCommand("listserv", Command_Listserv_f);}static void CloseConnection(void){ if (socket_fd > 0) close(socket_fd); socket_fd = -1;}static int GetServersList(void){ msg_t msg; int count = 0; msg.type = GET_SERVER_MSG; msg.length = 0; if (MS_Write(&msg) < 0) return MS_WRITE_ERROR; while (MS_Read(&msg) >= 0) { if (msg.length == 0) { if (!count) CONS_Printf("No server currently running.\n"); return MS_NO_ERROR; } count++; CONS_Printf(msg.buffer); } return MS_READ_ERROR;}#define NUM_LIST_SERVER 10msg_server_t *GetShortServersList(void){ static msg_server_t server_list[NUM_LIST_SERVER+1]; // +1 for easy test msg_t msg; int i; //arf, 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"); return NULL; } msg.type = GET_SHORT_SERVER_MSG; msg.length = 0; if (MS_Write(&msg) < 0) return NULL; for (i=0; (i<NUM_LIST_SERVER) && (MS_Read(&msg)>=0); i++) { if (msg.length == 0) { server_list[i].header[0] = 0; CloseConnection(); return server_list; } memcpy(&server_list[i], msg.buffer, sizeof(msg_server_t)); server_list[i].header[0] = 1; } CloseConnection(); if (i==NUM_LIST_SERVER) { server_list[i].header[0] = 0; return server_list; } else return NULL;}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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -