⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mserv.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 + -