Re: [twsocket] how to use ICS correctly

2016-01-27 Thread Angus Robertson - Magenta Systems Ltd
> Am currently using ICS for a large chat system but now my service 
> is getting bigger am starting to worry I not really done the 
> socket code best I can below is the server side for receiving 
> string commands 

There is nothing specifically wrong with your code, except the server
is blocked to further incoming traffic while LoginToService runs.  

Generally not a good idea to block for more than a few milliseconds.
If you need to provide a response to the remote client, there is not
much you can do, except perhaps run a FIFO queue of requests. 

> also other idea am interested in looking into is 
> a main server that controls other servers so can host multiple 
> servers around world and main server will link them all and 
> client will know were to connect.

You can get DNS services that provide results according to geolocation,
that's how Microsoft, Google, etc direct to local servers.  How the
servers share data is rather more complex, particularly is each server
has to provide the same data received by any other server.

Angus

-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be


Re: [twsocket] how to use ICS correctly

2016-01-27 Thread Michael Gasser

ICS support mailing 

Hi Simon

I run a card game. Protocol tcp. Users can play, chat, and send pictures 
/ (very large) files. It's p2p.  Every game can act as a server (if 
either the user opens a port  or UPnP is enabled (then it's done by the 
game)).


Login: I use three servers - one main server and two backup servers. 
Users log in to one of the three servers. If the game acts as server, it 
posts it's port. If login is successful, the game gets the list of all 
servers (games) [IP:port] currently online - it connects to all these 
servers.
[ After successful login I could shut down alle three login servers. 
Users who are online remain online - as everything is p2p. ]
If you have a large number of users, you can either use different rooms 
(that is what I do - I limit my rooms to about 100 users) or your chat 
software just connects to a subset of all available servers.


If a game acts as server it knows about all users in the room. If not, 
the game mus update the list of all users currently online via one of 
the servers.


As in a network a lot of thing may go wrong every server S periodically 
sends

> the number of all servers it sees
> a f.e. md5 signature of the list of all servers
to every server in the room. If one of the servers K sees another number 
of servers or calculates another signature (sees the same number of 
servers but at least one is different) then K and S exchange the full 
list of servers. After that K and S connect to the "additional" servers.


Data from A to B is always sent directly (if A or B act as server) 
or(/and additonally) from A to at least one (fast) server (game) and 
from this server to B. A knows about the fastest paths from A to B (by 
checking "fast paths").


Chat messages: You must either "time stamp" each message in a p2p system 
- or just use the "fastest" server (game) currently online as chat server.


Files: If a user A sends a file f to B, then after successful 
transmission A and B act as file server for the file f: If A or B send 
this file f to another game C, then C "asks" all games that are directly 
connected if they are server for f. If A and B are connected to C then C 
receives a YES from A and B => C downloads f from A and B.


Data: As in a p2p system

-> every server (game) might logoff anytime (packet might get lost) and
-> data from X  and Y is not always sent via the same server (it can 
happen that X sends D1 D2 - Y receives D2 D1)


I enumerate every packet sent from X to Y.  Y buffers the received 
packets. If Y receives D1 D2 D4 then D1 D2 will be parsed and D4 
buffered. If after a certain time (dependent on the "path time" X-Y) D3 
is still not available to Y, then Y asks X to resend D3.


My packets look like this : [number of packet][length of 
packet][data][digital signature]


Best regards
Michael





Am 27.01.2016 um 14:19 schrieb Simon Lewis:

Am currently using ICS for a large chat system but now my service is getting 
bigger am starting to worry I not really done the socket code best I can below 
is the server side for receiving string commands also other idea am interested 
in looking into is a main server that controls other servers so can host 
multiple servers around world and main server will link them all and client 
will know were to connect.

procedure TComServer.SocketServerDataAvailable(Sender: TObject; ErrCode: Word);
begin
   with Sender as TWSocketClient do
   begin
  RunCommand(ReceiveStr, Sender as TWSocketClient);
   end;
end;

then the run common would split the string command in there own sections and 
read from array and assign correct string to dat[id]

procedure TComServer.RunCommand(comdata: string; rSocket: TWSocketClient);
var
   command: string;
   dat: array [0..50] of string;
begin
   { INCOMING ENCODED DATA STRING }
   comdata := DecodeStr(comdata);

   { DECODE INCOMING DATA STRING }
   while DecodeCommand(comdata, command, dat) do begin
   case StrToIntDef(command, -1) of
  00: LoginToService(dat[0], rSocket);
end;
end;

now am starting to think maybe string is not a good way to go about this on a 
large scale service so am wondering if anyone else has ever built a chat system 
and what methods did you use?, any information be great. Thanks a lot

Yours
Simon


--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be