Author Topic: Socket functions for server->serevr menaging tool-script [SSSRMT]  (Read 1466 times)

0 Members and 1 Guest are viewing this topic.

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
hi there,
I need to send and recive data between 2 servers on different computers,
this is like menaging, or remote control.
SSSRMT = Soldat Server-Server Remote Menage Tool
Someone can build me functions?
(i already know these SendData, create socket, etc... --- just cant handle)

Remote control tool (client):
Code: [Select]
{///////////////////////////////////////////////
//// Soldat Server TCP Socket Usage Example ////
////     by EnEsCe - http://enesce.com      ////
////  Please leave this message if you use  ////
////      any of these functions! <3 <3     ////
///////////////////////////////////////////////}
{
Usage: (Creates socket in a seperate thread) 
CreateSocket('127.0.0.1',23073);
Use the OnDataReceived event below for any data parsing
}
var
SocketIndex: Integer;
SocketConnected: Array of Boolean;

cl: longint;
status: string; // "connected" "off" "created"
connectedto_ip: string;
connectedto_port: integer;


procedure wc (ID: Byte; Text: string; color: longint);
begin
WriteConsole (ID, '[SOCKET] ' +  Text, color);
WriteLn ('[SOCKET] ' + Text);
WriteLnFile('\socket-logs\' + FormatDate('dd.mm.yy') + '.txt', FormatDate ('hh:nn:ss:zz') + '>' + Text);
end;

procedure OnDataReceived(Index: Integer; Buffer: String);
begin
if (Index = 0) or (SocketConnected[Index] = false) then exit; { Disconnected socket? }
end;

procedure MainSocketLoop(Index: Integer);
var Buff: String;
begin
while SocketConnected[Index] do begin 
ReadLnSocket(Index,Buff); 
if Buff <> '' then OnDataReceived(Index,Buff); 
sleep(1);
end;
end;

procedure OnConnected(Index: Integer);
begin
SetArrayLength(SocketConnected,GetArrayLength(SocketConnected)+2);
ThreadFunc([Index],'MainSocketLoop');
SocketConnected[GetArrayLength(SocketConnected)-1] := true;
end;

procedure OnDisconnected(Index: Integer);
begin
SocketConnected[GetArrayLength(SocketConnected)-1] := false;
end;

procedure ThreadedCreate(IP: String;Port: Integer;var IndexVar: Integer);
begin
ConnectSocket(IP,Port,IndexVar);
OnConnected(IndexVar);
end;

procedure CreateSocket(IP: String;Port: Integer);
begin
ThreadFunc([IP,Port,SocketIndex],'ThreadedCreate');
end;

procedure Disconnect();
begin
status := 'off';
OnDisconnected(2);
end;

procedure ActivateServer ();
begin
status := 'off';
wc (0, 'Recompiled!', $EEFF00FF);
end;

function OnPlayerCommand (ID: Byte; Text: string): boolean;
begin
if GetPiece(Text, ' ', 0) = '/connect' then begin
if status = 'off' then begin
status := 'connected';
connectedto_ip := GetPiece(Text, ' ', 1);
ConnectSocket(connectedto_ip, 23000, socketindex);
wc (0, 'Connecting to host: ' + Connectedto_ip + ':23000', $EE00FF00);
end else begin
wc(id, 'Already connected to host: ' + Connectedto_ip + ':23000' , $EEFF0000);
end;
end;
if GetPiece(Text, ' ', 0) = '/disconnect' then begin
if (status = 'connected') or (status = 'created') then begin
Disconnect();
wc (0, 'Disconnected!', $EE00FF00);
connectedto_ip := '';
end else begin
wc(id, 'Not connected' , $EEFF0000);
end;
end;
end;

Server controlled tool (server):
Code: [Select]
{///////////////////////////////////////////////
//// Soldat Server TCP Socket Usage Example ////
////     by EnEsCe - http://enesce.com      ////
///////////////////////////////////////////////}

var
//SocketIndex: Integer;
SocketConnected: Array of Boolean;

cl: longint;
sep: string; // seperate char
status: string; // "connected" "off" "created"
connectedto_ip: string;
connectedto_port: integer;
Data, file, filename, fileplace: string;
filesize: integer;

procedure wc (ID: Byte; Text: string; color: longint);
begin
WriteConsole (ID, '[SOCKET] ' +  Text, color);
WriteLn ('[SOCKET] ' + Text);
WriteLnFile(sep + 'socket-logs' + sep + FormatDate('dd.mm.yy') + '.txt', FormatDate ('hh:nn:ss:zz') + '>' + Text);
end;

procedure OnDataReceived(Index: Integer; Buffer: String);
begin
if (Index <> 2) or (SocketConnected[Index] = false) then exit; { Disconnected socket? }
ReciveFile(Buffer);
//ReciceMSG(Buffer);
//ReciceCMD(buffer);
end;

procedure MainSocketLoop(Index: Integer);
var Buff: String;
begin
while SocketConnected[Index] do begin 
ReadLnSocket(Index,Buff); 
if Buff <> '' then OnDataReceived(Index,Buff); 
sleep(1);
end;
end;

procedure OnConnected(Index: Integer);
begin
SetArrayLength(SocketConnected,GetArrayLength(SocketConnected)+2);
ThreadFunc([Index],'MainSocketLoop');
SocketConnected[GetArrayLength(SocketConnected)-1] := true;
end;

procedure ThreadedCreate(IP: String;Port: Integer;var IndexVar: Integer);
begin
ConnectSocket(IP,Port,IndexVar);
OnConnected(IndexVar);
end;

procedure CreateSocket(IP: String;Port: Integer);
begin
ThreadFunc([IP,Port,SocketIndex],'ThreadedCreate');
end;

procedure ReciveFile(data: string);
begin
if data = '•FILE_BEGIN' then begin // begin of file recording
file := '';
end;
if GetPiece (data, '•', 0) = 'F_I' then begin // get file information
filename := GetPiece (data, '•', 1);
fileplace := GetPiece (data, '•', 2);
filesize := strtoint(GetPiece (data, '•', 3));
WriteLn ('File transfer begins: ' + filename);
WriteLn ('  Size: '  + inttostr(filesize));
WriteLn ('  Location: '  + fileplace);
end;
if GetPiece (data, '•', 0) = 'F_T' then begin // collect file pieces
file := file + chr(13) + chr(10) + GetPiece (data, '•', 1);
end;
if data = '•FILE_END' then begin
WriteFile (sep + fileplace + sep + filename, file);
WriteLn ('File transfer complete: ''' + fileplace + sep + filename + '''');
end;
result := 0;
end;

procedure ActivateServer ();
begin
status := 'off';
wc (0, 'Recompiled!', $EEFF00FF);
CreateSocket ('127.0.0.1', 23000);
status := 'created';
wc (0, 'Socket created at port 23000', $EE00FF00);
if Getsystem = 'windows' then begin
sep = '\';
wc (0, 'Server system: Windows', $EEff00ff);
end else
if Getsystem = 'linux' then begin
sep = '/';
wc (0, 'Server system: Linux', $EEff00ff);
end else begin
wc(0, 'Could not detect server system [defaulting to windows]', $EEFF0000);
sep = '\';
end;
end;
« Last Edit: May 09, 2009, 02:01:18 pm by LORD KILLA »

Offline DorkeyDear

  • Veteran
  • *****
  • Posts: 1507
  • I also go by Curt or menturi
Re: Socket functions for server->serevr menaging tool-script
« Reply #1 on: May 08, 2009, 03:03:06 pm »
http://www.enesce.com/help/index.html?TCP%20Sockets.html
What I did was copy the exact same code that EnEsCe's example has.
After that, the main thing you need to know is when you receive data, you manage it with OnDataReceived, to send data, SendData; and it'd be a good idea to connect on ActivateServer or maybe AppOnIdle (once).
For the second server, you will need to treat your other server as an admin, and parse the messages through OnAdminMessage and other functions. To send data, either WriteLn it, or it'd be better to use TCPAdminPM.

Once you got yourself a connection; you'll need to create your very own protocol to send data between the servers. Depending on what your sending, it can be different.

Offline danmer

  • Camper
  • ***
  • Posts: 466
  • crabhead
Re: Socket functions for server->serevr menaging tool-script
« Reply #2 on: May 08, 2009, 03:35:24 pm »
wow... does it actually work without any sleep() and threadfunc?

Offline DorkeyDear

  • Veteran
  • *****
  • Posts: 1507
  • I also go by Curt or menturi
Re: Socket functions for server->serevr menaging tool-script
« Reply #3 on: May 08, 2009, 04:09:51 pm »
wow... does it actually work without any sleep() and threadfunc?
the function that reads a line waits for the next line of data to come, but if you know how many lines of data you actually need to pick up, i suppose its not completely necessary to have a threadfunc; but it usually is.

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script
« Reply #4 on: May 09, 2009, 04:00:13 am »
Ok, i think i got it
but i even cant connect cuz save mode is on, i cant find it in any of the server.ini soldat.ini and tried -save 0 but this dont work, someone knows what exactly put into batch file, or howto disable save mode ?

Offline danmer

  • Camper
  • ***
  • Posts: 466
  • crabhead
Re: Socket functions for server->serevr menaging tool-script
« Reply #5 on: May 09, 2009, 05:24:33 am »
just use this file to run your server:
Code: [Select]
:JFK
soldatserver -safe 0
goto JFK

(save as .bat of course)

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script
« Reply #6 on: May 09, 2009, 05:54:31 am »
soldatserver.exe -save 0
this should work, but it dont

Offline mar77a

  • Global Moderator
  • Veteran
  • *****
  • Posts: 1295
  • mad
    • random stuffs
Re: Socket functions for server->serevr menaging tool-script
« Reply #7 on: May 09, 2009, 09:45:54 am »
safe, not save

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script
« Reply #8 on: May 09, 2009, 10:04:51 am »
ok, thaks, this works
-safe 0
becouse i dont know much about this, i have posted the script code.

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script [SSSRMT]
« Reply #9 on: May 09, 2009, 11:29:36 am »
what function do you use to read data recived ?

Offline Toumaz

  • Veteran
  • *****
  • Posts: 1906
Re: Socket functions for server->serevr menaging tool-script [SSSRMT]
« Reply #10 on: May 09, 2009, 11:53:13 am »
Quote
- ConnectSocket
 Use this function to create the socket and connect it.
- CloseSocket
 Disconnect a socket created with CreateSocket and destroy from memory.
- SendData
 Send a string to a socket.
- ReadLnSocket
 Read a line from a socket to a variable (Line end character is 0A (chr(10))

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script [SSSRMT]
« Reply #11 on: May 09, 2009, 11:57:53 am »
i just seen that enesce said sth like: "use the OnDataRecived event to analyse any data parsing"
ill post my code ive written in a few min
for toumaz:
 where do i know that i read the line i need ?

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script [SSSRMT]
« Reply #12 on: May 09, 2009, 01:59:36 pm »
I begun to write the server side script, but i ger VERY MYSTERIOUSE BUG:
Code: [Select]
   Compiling Menager -> menager_client.pas... Menager -> [Hint] (82:10): Variable 'Result' never used Menager -> [Error] (136:2): Duplicate identifier 'SocketConnected' Compilation Failed.the code is:
Code: [Select]
{///////////////////////////////////////////////
//// Soldat Server TCP Socket Usage Example ////
////     by EnEsCe - http://enesce.com      ////
///////////////////////////////////////////////}

var
   //SocketIndex: Integer;
   SocketConnected: Array of Boolean;
   
   cl: longint;
   sep: string; // seperate char
   status: string; // "connected" "off" "created"
   connectedto_ip: string;
   connectedto_port: integer;
   Data, file, filename, fileplace: string;
   filesize: integer;
   
procedure wc (ID: Byte; Text: string; color: longint);
begin
   WriteConsole (ID, '[SOCKET] ' +  Text, color);
   WriteLn ('[SOCKET] ' + Text);
   WriteLnFile(sep + 'socket-logs' + sep + FormatDate('dd.mm.yy') + '.txt', FormatDate ('hh:nn:ss:zz') + '>' + Text);
end;

procedure OnDataReceived(Index: Integer; Buffer: String);
begin
   if (Index <> 2) or (SocketConnected[Index] = false) then exit; { Disconnected socket? }
   ReciveFile(Buffer);
   //ReciceMSG(Buffer);
   //ReciceCMD(buffer);
end;

procedure MainSocketLoop(Index: Integer);
var Buff: String;
begin
   while SocketConnected[Index] do begin 
      ReadLnSocket(Index,Buff); 
      if Buff <> '' then OnDataReceived(Index,Buff); 
      sleep(1);
   end;
end;

procedure OnConnected(Index: Integer);
begin
   SetArrayLength(SocketConnected,GetArrayLength(SocketConnected)+2);
   ThreadFunc([Index],'MainSocketLoop');
   SocketConnected[GetArrayLength(SocketConnected)-1] := true;
end;

procedure ThreadedCreate(IP: String;Port: Integer;var IndexVar: Integer);
begin
   ConnectSocket(IP,Port,IndexVar);
   OnConnected(IndexVar);
end;

procedure CreateSocket(IP: String;Port: Integer);
begin
   ThreadFunc([IP,Port,SocketIndex],'ThreadedCreate');
end;

procedure ReciveFile(data: string);
begin
   if data = '•FILE_BEGIN' then begin // begin of file recording
      file := '';
   end;
   if GetPiece (data, '•', 0) = 'F_I' then begin // get file information
      filename := GetPiece (data, '•', 1);
      fileplace := GetPiece (data, '•', 2);
      filesize := strtoint(GetPiece (data, '•', 3));
      WriteLn ('File transfer begins: ' + filename);
      WriteLn ('  Size: '  + inttostr(filesize));
      WriteLn ('  Location: '  + fileplace);
   end;
   if GetPiece (data, '•', 0) = 'F_T' then begin // collect file pieces
      file := file + chr(13) + chr(10) + GetPiece (data, '•', 1);
   end;
   if data = '•FILE_END' then begin
      WriteFile (sep + fileplace + sep + filename, file);
      WriteLn ('File transfer complete: ''' + fileplace + sep + filename + '''');
   end;
   result := 0;
end;

procedure ActivateServer ();
begin
   status := 'off';
   wc (0, 'Recompiled!', $EEFF00FF);
   CreateSocket ('127.0.0.1', 23000);
   status := 'created';
   wc (0, 'Socket created at port 23000', $EE00FF00);
   if Getsystem = 'windows' then begin
      sep = '\';
      wc (0, 'Server system: Windows', $EEff00ff);
   end else
   if Getsystem = 'linux' then begin
      sep = '/';
      wc (0, 'Server system: Linux', $EEff00ff);
   end else begin
      wc(0, 'Could not detect server system [defaulting to windows]', $EEFF0000);
      sep = '\';
   end;
end;

FIXED
« Last Edit: May 10, 2009, 05:36:07 am by LORD KILLA »

Offline LORD KILLA

  • Camper
  • ***
  • Posts: 254
  • Happie
Re: Socket functions for server->serevr menaging tool-script [SRMT]
« Reply #13 on: May 12, 2009, 06:41:47 am »
Do i need to have forwarded ports to CreateSocket ?

Offline Toumaz

  • Veteran
  • *****
  • Posts: 1906
Re: Socket functions for server->serevr menaging tool-script [SSSRMT]
« Reply #14 on: May 12, 2009, 11:52:52 am »
Do i need to have forwarded ports to CreateSocket ?
Yes. A port is a port, after all.

Offline shantec

  • Soldier
  • **
  • Posts: 140
  • Get ANGREH!!
Re: Socket functions for server->serevr menaging tool-script [SSSRMT]
« Reply #15 on: May 13, 2009, 07:11:21 am »
For the second server, you will need to treat your other server as an admin, and parse the messages through OnAdminMessage and other functions. To send data, either WriteLn it, or it'd be better to use TCPAdminPM.

Quote
parse the messages through OnAdminMessage and other functions
And what are these "other functions" excactly?
I tried with TCPAdminPM and OnAdminMessage but couldnt get any results...


Code: [Select]
function OnPlayerCommand (ID: byte; Text: string): boolean;
begin
if GetPiece(text, ' ', 0) = '/connect' then begin
Connect(GetPiece(text, ' ', 1), GetPiece(text, ' ', 2), getpiece(text,' ',3));
end;
if GetPiece(Text,' ', 0) = '/data' then begin
If IPP <> '' then begin
TCPAdminPM(IPP,'test');
WriteConsole(0,'Data sent',co);
end else begin
WriteConsole(0,'Not connected to server',co);
end;
end;
end;

procedure OnAdminMessage(IP, Msg: string);
begin
//If (IP = IPP) then begin
WriteLn('Data recieved');
//end;
end;

//IPP = target ip
What am i doing wrong?


Edit
Nvm, ended up using SendData and Mainsocketloop
« Last Edit: May 13, 2009, 09:27:13 am by shantec »
Also Known As REIMA


Lol Happles (happy apples)