// Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // // Copyright (C) 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. // //----------------------------------------------------------------------------- #ifndef _IPCS_H_ #define _IPCS_H_ #include "common.h" #if defined (_WIN32) || defined ( __OS2__) #include #include typedef int socklen_t; #if defined (__OS2__) #include #endif #endif #ifdef _WIN32 #include #define close closesocket #else #include // inet_addr(),... #endif #ifndef SOCKET #define SOCKET u_int #endif // ================================ DEFINITIONS =============================== #define PACKET_SIZE 1024 #define MAX_CLIENT 512 #ifndef _WIN32 #define NO_ERROR 0 #define SOCKET_ERROR -201 #endif #define BIND_ERROR -202 #define CONNECT_ERROR -203 #define LISTEN_ERROR -204 #define ACCEPT_ERROR -205 #define WRITE_ERROR -210 #define READ_ERROR -211 #define CLOSE_ERROR -212 #define GETHOSTBYNAME_ERROR -220 #define SELECT_ERROR -230 #define TIMEOUT_ERROR -231 #define MALLOC_ERROR -301 #define INVALID_MSG -1 #define ACCEPT_MSG 100 #define ADD_SERVER_MSG 101 #define ADD_CLIENT_MSG 102 #define REMOVE_SERVER_MSG 103 #define ADD_SERVERv2_MSG 104 #define GET_SERVER_MSG 200 #define SEND_SERVER_MSG 201 #define GET_LOGFILE_MSG 202 #define SEND_FILE_MSG 203 #define ERASE_LOGFILE_MSG 204 #define GET_SHORT_SERVER_MSG 205 #define SEND_SHORT_SERVER_MSG 206 #define ASK_SERVER_MSG 206 #define ANSWER_ASK_SERVER_MSG 207 #define GET_MOTD_MSG 208 #define SEND_MOTD_MSG 209 #define GET_ROOMS_MSG 210 #define SEND_ROOMS_MSG 211 #define GET_ROOMS_HOST_MSG 212 #define GET_VERSION_MSG 213 #define SEND_VERSION_MSG 214 #define GET_BANNED_MSG 215 #define PING_SERVER_MSG 216 #define UDP_RECV_MSG 300 #define TIMEOUT_MSG 301 #define HTTP_REQUEST_MSG 875770417 // "4321" #define SEND_HTTP_REQUEST_MSG 875770418 // "4322" #define TEXT_REQUEST_MSG 825373494 // "1236" #define SEND_TEXT_REQUEST_MSG 825373495 // "1237" #define RSS92_REQUEST_MSG 825373496 // "1238" #define SEND_RSS92_REQUEST_MSG 825373497 // "1239" #define RSS10_REQUEST_MSG 825373744 // "1240" #define SEND_RSS10_REQUEST_MSG 825373745 // "1241" #define ADD_PSERVER_MSG 0xabacab81 // this number just need to be different than the others #define REMOVE_PSERVER_MSG 0xabacab82 // Sent FROM Client #define LIVE_AUTH_USER 600 #define LIVE_AUTH_KEY 601 #define LIVE_GET_USER 602 #define LIVE_UPDATE_LOCATION 603 #define LIVE_UPDATE_PUBLIC_KEY 604 #define LIVE_AUTH_PUBLIC_KEY 605 // Sent TO Client #define LIVE_INVALID_KEY 800 #define LIVE_INVALID_USER 801 #define LIVE_AUTHORISED_KEY 802 #define LIVE_SEND_USER 803 #define LIVE_VALIDATED_USER 804 // Location Types #define LIVE_LOCATION_SP 100 #define LIVE_LOCATION_MENU 101 #define LIVE_LOCATION_MP_JOIN 102 #define LIVE_LOCATION_MP_HOST 103 #define LIVE_LOCATION_MP_LOCAL 104 #define LIVE_LOCATION_MP_PRIVATE 105 #define HEADER_SIZE ((UINT32)sizeof (UINT32)*4) #define HEADER_MSG_POS 0 #define IP_MSG_POS 16 #define PORT_MSG_POS 32 #define HOSTNAME_MSG_POS 40 #if defined(_MSC_VER) #pragma pack(1) #endif // Keep this structure 8 bytes aligned (current size is 80) typedef struct { char header[16]; // information such as password char ip[16]; char port[8]; char name[32]; INT32 room; char key[32]; // Secret key for linking dedicated servers to accounts char version[8]; // format is: x.yy.z (like 1.30.2 or 1.31) } ATTRPACK msg_server_t; typedef struct { char header[16]; UINT32 id; char name[32]; char motd[256]; } ATTRPACK msg_rooms_t; typedef struct { char header[16]; char ipstart[16]; char ipend[16]; char endstamp[32]; char reason[256]; UINT8 hostonly; } ATTRPACK msg_ban_t; typedef struct { char header[16]; INT32 id; char username[100]; char password[32]; } ATTRPACK msg_live_auth_t; typedef struct { char header[16]; INT32 uid; char username[100]; INT32 location_type; char location_ip[32]; INT32 location_port; INT32 lastseen_type; char lastseen_data1[256]; char lastseen_data2[256]; char lastseen_data3[256]; } ATTRPACK msg_live_user_t; typedef struct { char header[16]; UINT8 location_type; char location_ip[32]; INT32 location_port; char location_data1[256]; char location_data2[256]; char location_data3[256]; } ATTRPACK msg_live_updatelocation_t; typedef struct { char header[16]; char publickey[256]; char username[256]; } ATTRPACK msg_live_validateuser_t; typedef struct { char header[16]; char username[256]; UINT8 keytype; char keydata[256]; } ATTRPACK msg_live_update_key_t; typedef struct { UINT32 id; INT32 type; INT32 room; INT32 length; char buffer[PACKET_SIZE]; } ATTRPACK msg_t; #if defined(_MSC_VER) #pragma pack() #endif class CSocket { protected: sockaddr_in addr; msg_t msg; fd_set rset; public: int getIP(const char *); CSocket(); ~CSocket(); }; class CServerSocket : public CSocket { private: sockaddr_in udp_addr; sockaddr_in udp_in_addr; SOCKET udp_fd; SOCKET accept_fd; size_t num_clients; SOCKET client_fd[MAX_CLIENT]; sockaddr_in client_addr[MAX_CLIENT]; public: int deleteClient(size_t id); int listen(const char *str_port); int accept(void); int read(msg_t *msg); const char *getUdpIP(void); const char *getUdpPort(bool); int write(msg_t *msg); int writeUDP(const char *data, size_t length, const char *ip, UINT16 port); const char *getClientIP(size_t id); const char *getClientPort(size_t id); CServerSocket(void); ~CServerSocket(void); }; class CClientSocket : public CSocket { private: SOCKET socket_fd; public: int connect(const char *ip_addr, const char *str_port); int read(msg_t *msg); int write(msg_t *msg); CClientSocket(void); ~CClientSocket(void); }; // ================================== PROTOS ================================== // ================================== EXTERNS ================================= #endif