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

📄 comline_v1.7.3.cpp

📁 Atheon is a portable Server/Client program designed for easy incorporation into just about any game
💻 CPP
字号:
/*
   Name:            ComLine
   Author:          atheon development team
   Description:     client/server program
   Date:            Friday, Mar. 7, 2003
   Version:         1.7.3
*/


//****************************************************************
// CHANGE LOG - PLEASE KEEP AT TOP OF FILE !
//****************************************************************
//
/*  Errors Produces from most recent change:
    - passing 'char' to argument 1 of 'position_insertion_point(in_addr *)' lacks a cast
    - passing 'in_addr *' as argument 2 of 'strcmp(const char *, const char *)'

    I am not sure how to fix this.  I was thinking possibly passing by pointers or something.
    -> zepplin 4/26/03 10:43:50 AM EST */
/*  Changes
    - New IPL System
    - Still to be fixed before release of v1.7.3 :
            - remove 'send'
            - fix "special" commands like 'leave' or 'clr'
            - incorporate IPL
            - allow ip input rather than always local
      -> zepplin 4/7/3 6:43 PM EST
      */
/*  Changes
    - IP Logger (IPL) added
         oh man! i dont know how to do this...
         Errors:
         -cant convert r_addr.sockaddr_in::sin_addr (the clients ip) to type char* to be stored in a double linked list
         -dont know how to remove ONLY ONE client from the linked list
         -AH! i need help!
    -> zepplin 3/22/03 11:03 EST
    */
/* Changes
  - I find that switches are tanks when it comes to data security. lol does that make sense?...
  - added socket reconnect for reuseability

  -> zepplin 3/9/03 13:49 EST

/* Changes
  - added server/client login/logout commands and corresponding functions
  - added send function
  - added new commandline prompts

  -> zepplin 3/7/03 11:44 EST

  TBA before next release:        // while(TBA == to be added && TBA != to be announced)
  -server log client ip
  -client send version, ip, and kill msg
  -true multi-threaded client  (TMTC)
  -SpitOut
  -Multiple Data Passing (MDP)

  Current errors:
  -84 comline_v7.1.cpp  `sizeof' applied to incomplete type `r_addr'
  -264 comline_v7.1.cpp  parse error before `,'
  -273 comline_v7.1.cpp  parse error before `.'
  -290 comline_v7.1.cpp  parse error before `.'
*/

/* Changes
	Cleaned up the code :-)

	-thebean 07/03/03 6:06 EST
*/


//  *****Changes 3-7-03
// Added obnoxious changelog header ^^^^^ wo0T!
// Added WSAGetLastError() to help debug client
// revamped the IP/Hostname resolution
// spruced up the server returning client IP
// and added client IP to logfile(may come in handy)
//
//
// -curtisk 3-7-03 1:09PM EST

/* !!! Changes

- newpass(); added
- old commands removed
- help.h updated
- client choose server ip created
- cleaned up
- infinite loop stopped
- custom ip input

-zepplin 3-6-03 10:52 AM EST */




#include <windows.h>
#include <fstream.h>
#include <string.h>
#include <winsock.h>
#include <stdio.h>
#include <time.h>

typedef int socklen_t;

#include <iostream>
#include <stdlib.h>
#include "help_v3.h"
#include "IPL.h"

char com[25];
char pass[25];

void shutdown();
void admin();
void newpass();

int login_server();
int login_client(const char*);
void login_IP_specification();

void logout_server();
void logout_client();

int start_server();
int start_client();

bool administrator=0;
bool logged_in_as_client=0;
bool logged_in_as_server=0;
bool disconnect=0;

using namespace std;

/* global socket variables */

// server:
   struct sockaddr_in r_addr;
    SOCKET    t1, new_fd;
    socklen_t len = sizeof(r_addr);
    int sin_size;

// client:
    hostent* h;

// both:
    struct sockaddr_in addr;
    SOCKET   s1;
    int r;

/* end of global socket variables */

int main() {
	WSADATA wsa_data;
	WSAStartup(MAKEWORD(1,1), &wsa_data);
	int run=0;

	do{
        if(logged_in_as_client==0 && logged_in_as_server==0) {
        if(administrator==0) {
        cout<<"$>";}
        else {
        cout<<"admin>";}
        }
        else if(logged_in_as_client==1) {
        cout<<"client>";}
        else if(logged_in_as_server==1) {
        cout<<"server>";}

		cin.get(com, 25);
		cin.ignore(80, '\n');  // stops infinite loop after client call

    	// help command
    	if(strcmp(com, "help") == 0)
    		help();
   		// clear screen (clr) command
   		else if(strcmp(com, "clr") == 0)
   			system("cls");
		// admin command
		else if(com[0]=='a' && com[1]=='d' && com[2]=='m' && com[3]=='i' && com[4]=='n' && com[5]==':' && com[6]==':'){
			ifstream now;
			now.open("admin.txt", ios::in);
			if(now){
			now>>pass;
			now.close();
			}
			else cout<<"Error in file: admin.txt"<<endl;
			if(com[7]==pass[0] && com[8]==pass[1] && com[9]==pass[2] && com[10]==pass[3]){
				admin();
				system("cls");
			}
		}
		// server command
		else if(strcmp(com, "login server") == 0)
			login_server();
		// client command ******added
		else if(strcmp(com, "login client") == 0) {
			login_IP_specification(); }
 		else if(strcmp(com, "start server") == 0)
			start_server();
   		else if(strcmp(com, "logout server") == 0)
			logout_server();
		// client command ******added
		else if(strcmp(com, "logout client") == 0) {
            disconnect=1;
			logout_client();}
		// quit and exit commands
		else if((strcmp(com, "quit") == 0) || strcmp(com, "exit") == 0){
			shutdown();
			return 0;
   		}

   	}while(run==0);
   	WSACleanup();
   	return 0;
}

void shutdown() {
	system("cls");
	cout<<"Close_Command_List";
	Sleep(300);
	system("cls");
	cout<<"Close_Main_Menu";
	Sleep(500);
	system("cls");
	cout<<"Close_Connections";
	Sleep(300);
	system("cls");
	cout<<"Close_System_Files";
	Sleep(600);
	system("cls");
	cout<<"Close_Console";
	Sleep(700);
	system("cls");
}

/* works as long as you have an admin.txt with your password in it and its in the same
folder */

void admin(){
	int runtime=0, opt;
	do{
		system("cls");
		cout<<"Administrator's Menu"<<endl;
		cout<<"--------------------"<<endl;
		cout<<"1) Overwrite Password"<<endl;
		cout<<"2) Close Admin Menu without logging off Administrator"<<endl;
		cout<<"0) Close Admin Menu and log off Administrator"<<endl;
		cin>>opt;

		switch(opt){
			case 1:		newpass();
						break;

			case 2:		runtime=1;
						administrator=1;
						system("cls");
						break;
			default:	runtime=1;
						administrator=0;
						system("cls");
		}
	}while(runtime==0);
	cin.ignore(80, '\n');
}

/* New function to allow for password changing */
void newpass(){
	char temp[25];
	cin.ignore(80, '\n');
	cout<<"New Password: ";
	cin.get(temp, 25);
	cin.ignore(80, '\n');
	ofstream dab;
	dab.open("admin.txt", ios::out);
	if(dab){
		dab<<temp;
		dab.close();
	}
	else
	{
		cout<<"Error writing file: admin.txt"<<endl;
	}
}

int login_server() {
    create_file(); // create IPLogger file

    s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(INVALID_SOCKET == s1) {
        perror("Could not create socket");
        return 0;
    }

    memset((void*)&addr, 0, sizeof(addr));
    addr.sin_family      = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port        = htons(12002);

    r = bind(s1, (struct sockaddr*)&addr, sizeof(addr));
    if(SOCKET_ERROR == r) {
        perror("Could not bind to local socket");
        closesocket(s1);
        return 0;
    }

    r = listen(s1, 10);
    if(SOCKET_ERROR == r) {
        perror("Could not listen to local socket");
        closesocket(s1);
        return 0;
    }

    logged_in_as_server=1;
}

int start_server()
{
        char user_input[1000];
    	char server_info[] = "ComLine Server v1.7.3 Host: zepplin\0";
        char terminate[] = "exit\0";

        bool flag=0;

        while(1) {

    	sin_size = sizeof(struct sockaddr_in);
    	char recieved[1024];

    	printf("Waiting for connection... ");

    	t1 = accept(s1, (struct sockaddr*)&r_addr, &len);
    	if(INVALID_SOCKET == s1) {
        	perror("Could not accept new connection");
            closesocket(s1);
            return 0;
         }

         printf("accepted.\n");

         // Sends data to IPLOGGER
         add_record(r_addr.sin_addr);

         printf("server: got connection from %s\n", inet_ntoa(r_addr.sin_addr));
         // ***************** redid above line - curtisk

         memset((void*)recieved, 0, sizeof(recieved));
         recv(t1, recieved, sizeof(recieved), 0);
         printf("Client: %s\n", recieved);

         if(flag==0) {
         send(t1, server_info, strlen(server_info), 0);
         }
         else {
         cout<<"Send to client: ";
         cin.get(user_input, 1000);
         cin.ignore(80, '\n');

         /* CLIENT - TO - SERVER COMMANDS */

         if(strcmp(recieved, "exit" ) == 0 || strcmp(recieved, "logout client") == 0) {
         delete_record(r_addr.sin_addr);
         }

         /* END C - T - S C */

         /* SERVER - TO - CLIENT COMMANDS */

         if(strcmp(user_input, "server info") == 0) {
         send(t1, server_info, strlen(server_info), 0);}

         else if(strcmp(user_input, "clr") == 0) {
         system("cls");}

         else if(strcmp(user_input, "exit") == 0) {
         send(t1, terminate, strlen(terminate), 0);
         logout_server();
         return 0;}

         else if(strcmp(user_input, "display") == 0) {
         cout<<getallips()<<endl;}

         else { send(t1, user_input, strlen(user_input), 0); }

         /* END S - T - C C */

         if(flag==1) {
         send(t1, user_input, strlen(user_input), 0);
         }
         }

         ofstream data;
         data.open("ServerLog.txt", ios::app);
         if(data){
         	time_t tm;
         	time(&tm);
         	data<<asctime(localtime(&tm));
         	data<<"Sent > "<<user_input<<endl;
         	data<<"Recieved > "<<recieved<<endl;
         	data<<"Client IP Address > "<<inet_ntoa(r_addr.sin_addr)<<endl<<endl;
         	//**********added IP to log -curtisk
         	data.close();
         }
         flag=1;
    }
    return 0;
}

void logout_server() {
         delete_list();
         if(s1 || t1 || new_fd){
             closesocket(t1);
             closesocket(s1);
             closesocket(new_fd);
             cin.ignore(80, '\n');
        }
        logged_in_as_server=0;
}

/* always get an error #10049 cannont connect to server, whether first time connecting or refresh */
void login_IP_specification() {
    char local_host[16];
    cout<<"IP: ";
    cin.get(local_host, 16);
    cin.ignore(80, '\n');
    login_client(local_host);
    }

int login_client(char local_host[16]) {
    memset((void*)&addr, 0, sizeof(addr));
    addr.sin_addr.s_addr = inet_addr(local_host);
    //if inet_addr worked then thats all we need ^^^
    //if not try DNS
    if(INADDR_NONE == addr.sin_addr.s_addr) {
        h = gethostbyname(local_host);
        if(NULL == h) {
        //no good!
            cout<<"gethostbyname Error: Winsock Error# "<<WSAGetLastError()<<endl;
            return -1;
        }
         //get host by name was OK
         addr.sin_addr = *((in_addr*)*h->h_addr_list);
    }

    s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(INVALID_SOCKET == s1) {
        cout<<"Could not create socket: "<<WSAGetLastError()<<endl;
        return -1;
    }

    addr.sin_family = AF_INET;
    //addr.sin_addr   = *((in_addr*)*h->h_addr_list);
    // ^^^ done above - curtisk
    addr.sin_port   = htons(12002);

    printf("Connecting... ");
    r = connect(s1, (sockaddr*)&addr, sizeof(struct sockaddr));
    if(SOCKET_ERROR == r) {
        cout<<"Cannot connect to server: "<<WSAGetLastError()<<endl;
        closesocket(s1);
        return -1;
    }

    printf("connected.\n");
    logged_in_as_client=1;
    start_client();
    disconnect=0;
}

int start_client()
{
    char client_info[]="ComLine Client v1.7.3";
    char recieved[1024];
    char user_input[1000];

    int counter=0;

    do {
    counter++;
    cout<<"send>";
    cin.get(user_input, 1000);
    cin.ignore(80, '\n');

    /* CLIENT - TO - SERVER COMMANDS */

    if(counter==1) {
    send(s1, client_info, strlen(client_info), 0);}
    else {

    if(strcmp(user_input, "client info") == 0) {
    send(s1, client_info, strlen(client_info), 0);}

    else if(strcmp(user_input, "clr") == 0) {
    system("cls");}

    else if(strcmp(user_input, "exit") == 0) {
    send(s1, user_input, strlen(user_input), 0);
    logout_client();
    return 0;}

    else { send(s1, user_input, strlen(user_input), 0); }

    }

    /* END C - T - S C */

    memset((void*)recieved, 0, sizeof(recieved));
    recv(s1, recieved, sizeof(recieved), 0);

    printf("Server: %s\n", recieved);

    /* SERVER - TO - CLIENT COMMANDS */

    if(strcmp(recieved, "exit") == 0) {
    logout_client();}
    if(strcmp(recieved, "logout server") == 0) {
    logout_client();}

    /* END S - T - C C */
    }while(user_input != "exit");
}

void logout_client() {
    switch(disconnect) {
    case 1:
    closesocket(s1);
    logged_in_as_client=0;
    break;
    default:
    closesocket(s1);
    logged_in_as_client=1;
    break;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -