📄 comline_v1.7.3.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 + -