Code archives/Networking/IP Management

This code has been declared by its author to be Public Domain code.

Download source code

IP Management by jfk EO-111102002
PLEASE NOTE: YOU BETTER USE GNET.

GNET is based on PHP and is used for the same purpose, but it's much better than this.
--------------------------------------------------------

Maybe someone finds this useful. I'm not a Perl
Crack and this Script is rather lousy...but it
works :) at least on my Machine. It's a new
Version, it now uses HTTP 1.1 instead of HTTP 1.0


Tested on WinME, XITAMI Webserver, ActivePerl
5.04 s well as Apache/1.3.12 on Unix, IIS 5 on NT.


Please read all Comments! As you maybe already
know, Perl can be pitty and Servers are diffrent.


There are 3 Files you'll have to select,copy and
paste from here:

hosted_games.txt (this one has a linefeed (empty line)at the end!!!)
list_games.pl the Perlscript
net_test.bb the BB-Example on how to use it

NOTE: The Technic used in this Perl Script to
open the Datafile for Reading, close it and open
it for Writing again is not a good idea.

I'm now working on a Version which uses a Flag-File to check if another Process is working with
the Data-File and to wait in a Loop if required.

IF IT DON'T WORKS:
There are several Reasons for it could fail. Here
is what you should check first:

Does the Server run other Script? Try to call this one:

#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
print "Your IP: $ENV{'REMOTE_ADDR'} <br>";
print "Time: $^T";
print "</html>";

call this as 'test.pl' in a Webbrowser with the url
http://www.yourserver.com/cgi-bin/test.pl and it sould tell you IP and Time. Refresh, time should be diffrent now.

If this works then it seems your Server works ok.
(I had Servers which cannot tell IP, cannot say Time or cannot open Files)

Now surf to
http://www.yourserver.com/cgi-bin/list_games.pl?action=list

The Browser should now list the Games (there is 1 Dummy Game in the list per default). The Length of the Header isn't the same on all Servers so it is up to you, to help Blitz, to read all information from the TCP Stream. The Format:

Host
127.1.2.45 (Game Host IP)
Capture the Flag (Game Topic)
10 3274568235 (Max. Players and last Game Update Time)
nick of Host
nick of Player2 (if somebody has joined)
nick of Player3 (if somebody has joined)
(empty line)
Host
190.10.122.87 (Game Host IP)
Nothin (Game Topic)
10 3274568455 (Max. Players and last Game Update Time)
nick of Host
nick of Player2 (if somebody has joined)
nick of Player3 (if somebody has joined)
nick of Player4 (if somebody has joined)
nick of Player5 (if somebody has joined)
(empty line)
>>>> Servertime: 23492374928

Make shure Blitz will find the Line starting with
">>>>" for the Servertime

I really got to do some Bugfixes in the Perlscript too, I'll update this soon.
file hosted_games.txt
cut here..............................
Host 65464.64646
127.0.0.1
This is a Dummy Host
10 102175228100
Don't
try
to connect!

cut here..............................






















file list_games.pl
cut here..............................
#!/usr/bin/perl -w

###########################################################################################
#
#                                 ************************************
#                                 Net Test for CSP Games IP Management
#                                 ************************************
#
# Note: You should unrem all 'flock'-Commands if possible!!!! I had to deactivate
# them cause it didn't work on WinME, but the flocks are needed to prevent multiple
# Clients writing into the same File at the same Time. This could result in complete
# Loss of the Game List Content.
#
# On Unix you'll have to chmod the file 'hosted_games.txt' as 666 and this Script as 755.
# On Windows you'll have to set the file 'hosted_games.txt' properties to 'hidden'.
#
# Well, this Script is the work of a beginner, so please don't worry.
#
# Be carefull when you edit this Script: the Order of the Values can be messed up easily.
#
###########################################################################################

$Daten=$ENV{'QUERY_STRING'};

$host_timeout=180;  # timeout for mute Hosts ins Seconds (must be higher than in BB)

# use 5.004;  # maybe you need these 2 lines for flock
# use Fcntl qw(:DEFAULT :flock);

print "Content-type: text/html\n\n";
print "<html><br>\n";

$hpass=$^T * $ENV{'REMOTE_ADDR'};  # generate password
$count=0;
$hisip= $ENV{'REMOTE_ADDR'};  # get clients IP

## Split Parameters found in Adressline
$i=0;
@vliste=("");
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)  
 {
  ($name, $value) = split(/=/, $Feld);   
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/<!--(.|\n)*-->//g;      
  $Formular{$name} = $name;   
  $Formular{$value} = $value;
  $vliste[$i]=$value;
  $i++;
  }
$anzahl_paras=$i;



#------------------------------------------------------------------------------------
#                               REQUEST FOR HOSTED GAMES LIST
#------------------------------------------------------------------------------------
# This will send a list to the client. It will also delete Hosts which have a
# Timeout. It must be accessed with http GET as follows:
# http://127.0.0.1/cgi-bin/list_games.pl?action=list

if($vliste[0] eq "list")
 #read hostlist from disk
 {
  $i=0; 
  @Zeilen = ("");
  @Zeilen2 = ("");
  open(NICKLIST, "<hosted_games.txt") || die "File not found\n";
  # flock(NICKLIST,1) or die "Cannot LOCK file: $!";
  while(<NICKLIST>)
   {
    push(@Zeilen,$_);
    $i++;
   }
   # flock(NICKLIST,8) or die "Cannot UNLOCK file: $!";
   close(NICKLIST);
   $anzahl=$i+1;
 $i2=0;
 $flag=0;
 $upd=0;
 for($i=1;$i<$anzahl;$i++)
  {
   $check=$Zeilen[$i];
   chomp($check);
   if(length($check) >= 5)
   {
    $check=substr($check,0,4);
   if($check eq "Host") # check for timeout of a Host
    {
      $lastping=$Zeilen[$i+3];
      chomp($lastping);
      $lastpingl=length($lastping);
      $wo = rindex($lastping," ");
      $otime=substr($lastping,$wo,$lastpingl-$wo);
      $sec=($^T-$otime);  # secs since last info-update by host
      $omax=substr($lastping,0,$wo);
      $otopic=$Zeilen[$i+2];
      chomp($otopic);
      if($sec > $host_timeout) # timeout! delete host from list
      {
       $upd=1;
       $flag=1;
      }
    }
   }
   if($flag == 0)
    {
     $Zeilen2[$i2]=$Zeilen[$i];
     if($check eq "Host") {print "$check\n";}
     else {print $Zeilen2[$i2];}
     $i2++;
    }
   if($check eq "") # check for last line of a Game Block
    {
     $flag=0;
    }
  }

  # decide if the file must be updated
  if($upd == 1)
   {
    $anzahl=$i2-1;
    # open games list to overwrite
    open(NICKLIST, ">hosted_games.txt") || die "File not found\n";
    # flock(NICKLIST,2) or die "Cannot LOCK";
    for($i=0;$i<$anzahl;$i++)
      {
        print NICKLIST $Zeilen2[$i];
      }
    # flock(NICKLIST,8) or die "Cannot UNLOCK";
    close(NICKLIST);
   }
 }




#------------------------------------------------------------------------------------
#                             CLIENT WANTS TO BE A NEW HOST
#------------------------------------------------------------------------------------
# The Client chooses to be a new Host. Accessed ny http GET as follows:
#http://127.0.0.1/cgi-bin/list_games.pl?action=nuhost&nick=harry&topic=Capture%20flag!&max=10
#                                            action 0   nick 1   topic 2       max players 3

if($vliste[0] eq "nuhost")
{
 $i=0; 
 @Zeilen = ("");
 open(NICKLIST, "<hosted_games.txt") || die "File not found\n";
 # flock(NICKLIST,1) or die "Cannot LOCK file: $!";
 while(<NICKLIST>)
  {
   push(@Zeilen,$_);
   #   print $Zeilen[$i],"<br>\n";
   $i++;
  }
 # flock(NICKLIST,8) or die "Cannot LOCK file: $!";
 close(NICKLIST);
 $anzahl=$i+1;
 $ngames=0;
 $double=0;  # check if IP is already hosting
 for($i=1;$i<$anzahl;$i++)
 {
  $weniger=length($Zeilen[$i])-1;
  chomp($Zeilen[$i]);
#  print $Zeilen[$i],"<br>\n";
  if($weniger >= 5)
  {
   $check=substr($Zeilen[$i],0,4);
   if($check eq "Host")
   {
    $ngames++;
    if(substr($Zeilen[$i+1],0,length($Zeilen[$i+1])-1) eq $hisip)
    {
      $double=$i+1;
    }
   }
  }
 }
 if($double != 0)
 {
 print "Error 1   :IP is already hosting"; # IP is already hosting.
 }
 else # yes, a legal new Host
 {
  # open games list to overwrite
  open(NICKLIST, ">hosted_games.txt") || die "File not found\n";
  # flock(NICKLIST,2) or die "Cannot LOCK";
  for($i=1;$i<$anzahl;$i++)
  {
   print NICKLIST $Zeilen[$i],"\n";
   # $imerk=$i;
  }
  print NICKLIST "\n";                              # line feed
  print NICKLIST "Host $hpass\n";                   # "Host" Label
  print NICKLIST $ENV{'REMOTE_ADDR'},"\n";          # New Host IP
  print NICKLIST "$vliste[2]\n";                    # Topic
  print NICKLIST "$vliste[3] $^T\n";                # Max number of Players
  if(($vliste[1] eq "") || ($vliste[1] eq "Host") || ($vliste[1] eq "e_o"))
   { print NICKLIST "noname",$anzahl,"\n";}         # (legalized) Nick of Host
  else 
   { print NICKLIST "$vliste[1]\n"; }               # Nick of Host
  # flock(NICKLIST,8) or die "Cannot UNLOCK";
  close(NICKLIST);

  print "Welcome on CSP GS\n";  # Say hi to host
  print "$hpass\n";  # Send unique Password to host
 } # eo else ok nu host
} # eo nuhost





#------------------------------------------------------------------------------------
#                       A RUNNING GAME HOST SENDED UPDATED INFO
#------------------------------------------------------------------------------------
# Game Hosts request to update its Games Information in the list. Accessed by http GET:
# http://127.0.0.1/cgi-bin/list_games.pl?action=update&pass=7777777&max=12&n1=harry&n2=suzi&n3=rocky&n4=e_o
#                                            action=0      password=1   max.players=2   all nicks (host first)       "e_o"= end mark            

if($vliste[0] eq "update")
{
 $i=0; 
 @Zeilen = ("");
 open(NICKLIST, "<hosted_games.txt") || die "File not found\n";
 # flock(NICKLIST,1) or die "Cannot LOCK file: $!";
 while(<NICKLIST>)
  {
   push(@Zeilen,$_);
   #   print $Zeilen[$i],"<br>\n";
   $i++;
  }
 # flock(NICKLIST,8) or die "Cannot LOCK file: $!";
 close(NICKLIST);
 $anzahl=$i+1;
 $ngames=0;
 $double=0;  # check if IP is already hosting
 $lastping="";
 $otime="";
 $lastpingl=0;
 $wo=0;
 for($i=1;$i<$anzahl;$i++)
 {
  $weniger=length($Zeilen[$i])-1;
  chomp($Zeilen[$i]);
#  print $Zeilen[$i],"<br>\n";
  if($weniger >= 5)
  {
   $check=substr($Zeilen[$i],0,4);
   if($check eq "Host")
   {
    $check2=substr($Zeilen[$i],5,$weniger-5);
#    print "<b>",$check2,"</b><br>";
    $ngames++;
    if($vliste[1] eq $check2)  # compare passwords
    {
      $double=$i+1;
      #     print "<h1>Pass found!</h1>"; # Matching Password found
      $lastping=$Zeilen[$i+3];
      chomp($lastping);
      $lastpingl=length($lastping);
      $wo = rindex($lastping," ");
      $otime=substr($lastping,$wo,$lastpingl-$wo);
      $omax=substr($lastping,0,$wo);
      $otopic=$Zeilen[$i+2];
      chomp($otopic);
    }
   }
  }
 }
 if($double == 0)
 {
  print "Error 2   :Incorrect Password.";
 }
 else         # yes, a legal Host is updating
 {
  $i=1;
  $i2=1;
  # sort out old
  for($i=1;$i<$double-1;$i++) # copy first block
   {
    $Zeilen2[$i2]=$Zeilen[$i];
    $i2++;
   }
  # $i2=$i;
  $i++;
  while($Zeilen[$i] ne "")  # ignore old Info
  {
   $i++;
  }
  $imerk=$i+1;
  if($anzahl>$imerk)
  {
   for($i=$imerk;$i<$anzahl;$i++) # add rest block
    {
     $Zeilen2[$i2]=$Zeilen[$i];
     $i2++;
    }
  }
  #                         # add updated Infos
  $Zeilen2[$i2]="Host ".$vliste[1];
  $i2++;
  $Zeilen2[$i2]=$ENV{'REMOTE_ADDR'};
  $i2++;
  $Zeilen2[$i2]=$otopic;
  $i2++;
  $i3=2;
  $vliste[$i3]=$vliste[$i3]." $^T";  # Add timestamp
  while($vliste[$i3] ne "e_o")  # seek end of of updateinfo.
  {
   $Zeilen2[$i2]=$vliste[$i3];
   $i2++;
   $i3++;
  }
  $anzahl=$i2;
  # overwrite List File with updated Version
  open(NICKLIST, ">hosted_games.txt") || die "File not found\n";
  # flock(NICKLIST,2) or die "Cannot LOCK";
  for($i=1;$i<$anzahl;$i++)
  {
   print NICKLIST $Zeilen2[$i],"\n";
  }
  # flock(NICKLIST,8) or die "Cannot UNLOCK";
  close(NICKLIST);
  print "Thanks for updating on CSP GS\n";
 } # eo else ok nu host
} # eo nuhost







#------------------------------------------------------------------------------------
#                               RUNNING GAME HOST WANTS TO QUIT
#------------------------------------------------------------------------------------
# This will remove your Host from the List. It must be accessed with http GET as follows:
# http://127.0.0.1/cgi-bin/list_games.pl?action=byebye&pass=7777777

if($vliste[0] eq "byebye")
 #read hostlist from disk
 {
  $i=0; 
  @Zeilen = ("");
  @Zeilen2 = ("");
  open(NICKLIST, "<hosted_games.txt") || die "File not found\n";
  # flock(NICKLIST,1) or die "Cannot LOCK file: $!";
  while(<NICKLIST>)
   {
    push(@Zeilen,$_);
    $i++;
   }
   # flock(NICKLIST,8) or die "Cannot UNLOCK file: $!";
   close(NICKLIST);
   $anzahl=$i+1;
 $i2=0;
 $flag=0;
 $upd=0;
 for($i=1;$i<$anzahl;$i++)
  {
   $check=$Zeilen[$i];
   chomp($check);
   if(length($check) >= 5)
   {
    $check=substr($check,0,4);
   if($check eq "Host") # check for timeout of a Host
    {
      $lpass=substr($Zeilen[$i],5,length($Zeilen[$i])-6);
      if($lpass eq $vliste[1]) # password found, game will be removed from list
      {
       $upd=1;
       $flag=1;
      }
    }
   }
   if($flag == 0)
    {
     $Zeilen2[$i2]=$Zeilen[$i];
     $i2++;
    }
   if($check eq "") # check for last line of a Game Block
    {
     $flag=0;
    }
  }

  # decide if the file must be updated
  if($upd == 1)
   {
    $anzahl=$i2-1;
    # open games list to overwrite
    open(NICKLIST, ">hosted_games.txt") || die "File not found\n";
    # flock(NICKLIST,2) or die "Cannot LOCK";
    for($i=0;$i<$anzahl;$i++)
      {
        print NICKLIST $Zeilen2[$i];
      }
    # flock(NICKLIST,8) or die "Cannot UNLOCK";
    close(NICKLIST);
    print "byebye!";
   }
 }





#------------------------------------------------------------------------------------



print "\n>>>>Server Time: $^T\n";
print "<br></html>\n";
cut here..............................





















file net_test.bb
cut here..............................
;                                 ************************************
;                                 Net Test for CSP Games IP Management
;                                 ************************************
;
; Usually People have to know a Host IP to join a Game. This Program will help to keep
; a List of active Game Hosts on a Web Server with a static Adress and let the Player choose
; a running Game or to start a new Game as a Host and add his IP to the List.
;
; The following Program is used to interact with a webserver which hosts the
; Perl-Script '/cgi-bin/list_games.pl'. The file 'hosted_games.txt' must be in the cgi-bin folder 
; of the server. Note: this will not work without a server which is hosting the Script.
; This Program can still be optimized a lot. Error Handling, GFX and so on are very poor ATM. 
; However, if there's a Server then it should work. READ THE COMMENTS IN 'list_games.pl' !!!
;
; There is a maximum of about 25 Games with 25 Players each because of this Menu
; and maybe because of limited Bandwith of your Web-Server.
; Nicknames and Topics shouldn't be too long.
;
; This Sources are designed for Use with BlitzPlay, the UDP-Network-Library for BlitzBasic.
; Visit www.blitzbasic.com if you wonder what BlitzBasic is.
;
; How it works:
; *************
; game_list     will download a list of Game-Host IPs
; game_nuhost   will write your IP to the List on the Server
; game_update   will update your Game with the Players Names etc. in the List on the Server
; game_quit     will remove your Game-Hosts IP from the IP Management Server
;
; usually, when a Host want's to quit, the Host should chanche to the next Player. This Script
; and Program is capable of Handling such a Host Takeover. But the new Host must know the 
; Password. (password$)
;
; Tested on WinME, XITAMI Webserver, ActivePerl 5.04 s well as Apache/1.3.12 on Unix
; 2002 CSP

ip$="http://www.yourserver.com"  ; Enter the IP-Management Servers IP or Hostname here
port=80               ; Enter the IP-Management Servers HTTP Port here (usually 80)
list_upd_time=160000  ; Intervall Updates IP Management Server in ms. (should be lower than the one in the Perl Script)
;-----------------------------------------------------------------------------------

Graphics3D 800,600,16,2
SetBuffer BackBuffer()

Dim io$(1000)  ; Buffer for tcp i/o
.refresh
Global status$=""
Global iocount=0

               ; request for hosted games list
AppTitle "Connecting..."
game_list$(ip$,port)
AppTitle status$

For i=0 To iocount   ; check Start of Content Information
 If io$(i)="Host"
  start_content=i
  Exit
 EndIf
Next

If iocount>start_content   ; check integrity
 If io$(start_content)<>"Host"
  errexit("Error: The received File isn't a proper Games List")
 EndIf
Else
  errexit("Error: The received File isn't a proper Games List")
EndIf

ngames=0 ;       count games
For i=0 To iocount
 If io$(i)="Host"
  ngames=ngames+1
 EndIf
Next

If ngames=0
 errexit("Error: No Games in List") ; one Dummy-Game should always be there
EndIf


Dim nmembers(ngames)     ; Number of Players for each Game
Dim games(ngames)        ; Index of IP in io-Buffer
Dim maxmembers$(ngames)  ; Maximum Players per Game
Dim topic$(ngames)       ; Topics for each Game
Dim timestamp$(ngames)   ; Last ping (secs since 1970) for each Game
Dim nicks$(1000)         ; nicks for each Game

zz=0
For i=0 To iocount       ; sort stuff
 If io$(i)="Host"
  games(zz)=i+1
  topic$(zz)=io$(i+2)
  maxmembers$(zz)=io$(i+3)
  For k=1 To Len(maxmembers$(zz))  
   If Mid$(maxmembers$(zz),k,1)=" "
    cuthere=k
    Exit
   EndIf
  Next
  maxmembers$(zz)=Left$(maxmembers$(zz),cuthere)

  timestamp$(zz)=io$(i+3)
  timestamp$(zz)=Right$(timestamp$(zz),Len(timestamp$(zz))-(cuthere+3))
  zz2=0
  While io$(i+zz2+2)<>"" And zz2<1000
   zz2=zz2+1
  Wend
  nmembers(zz)=zz2
  If zz2>mostmembers Then mostmembers=zz2
  zz=zz+1
 EndIf
Next

Dim allmembers$(ngames,mostmembers)
For i=0 To ngames
 For j=0 To nmembers(i)
  allmembers(i,j)=io$(games(i)+3+j)
 Next
Next

servertime$="101010"
For i=iocount To 0 Step -1
If Len(io$(i))>4
 If Left$(io$(i),4)=">>>>"
  servertime$=io$(i)
 EndIf
EndIf
Next
  For k=Len(servertime$)  To 1 Step -1
   If Mid$(servertime$,k,1)=" "
    cuthere=k
    servertime$=Right$(servertime$,Len(servertime$)-(cuthere+3))
    Exit
   EndIf
  Next
; ________________________________________ SELECT HOST (or create new)___________________________________
ip_choice$=""
nuhost$=""
While KeyDown(1)=0 And ip_choice$="" And nuhost$=""
 Cls
 Color 0,0,50
 For i=0 To 600 Step 12
  Rect 0,i+1,800,12,0
 Next
 Color 0,0,255
 myline=MouseY()/12
 For i=0 To ngames-1
  Text 20,i*12,topic$(i)+" ("+io$(games(i))+") Hosted by: "+allmembers(i,0)
 Next
 Color 255,255,0
 Text 20,ngames*12,"Host a new Game"
 Color 255,255,255
 Text 20,(1+ngames)*12,"Refresh"
 If myline>=0 And myline< ngames
  i=myline
  Color 0,255,0
  Text 500,180,topic(i)
  Color 255,255,255
  Text 500,192,"IP: "+io$(games(i))
  Text 500,204,"Maximum of Players: "+maxmembers$(i)
  Text 500,216,"Last Livesign: "+(Int(servertime$)-Int(timestamp$(i)))+" Secs"
  Color 255,0,0
  For j=0 To nmembers(i)-3
   Text 500,240+j*12,allmembers(i,j)
  Next
  Color 255,255,255
  If MouseDown(1)=1
   ip_choice$=io$(games(i))
  EndIf
 EndIf
 If myline= ngames
  Color 0,255,0
  Text 500,180,"Click to Host a new Game"
  If MouseDown(1)=1
   nuhost$="yes"
  EndIf
 EndIf
 If myline= ngames+1
  Color 0,255,0
  Text 500,180,"Click to refresh Games List"
  If MouseDown(1)=1
   Goto refresh
  EndIf
 EndIf
 Flip()
Wend

hosting=0
joining=0

; ---------------------------------if JOIN --------------------------------
 If ip_choice$<>""
  Cls
  Text 20,20,"You decided to join a running Game"
  Text 20,40,ip_choice$
  Flip
  WaitKey()
  joining=1
 EndIf
; ---------------------------------if NEW HOST --------------------------------

 If nuhost$<>"" And ngames<26
  Cls
  Text 20,20,"You decided to host a new Game"
  Flip
  Locate 20,40
  nu_topic$=Input$("Topic? (max.20 Chrs.) ")
  If Len(nu_topic$)>20 Then nu_topic$=Left$(nu_topic$,20)
  Locate 20,60
  nu_nick$=Input$("Your Nickname? ")
  If Len(nu_nick$)>16 Then nu_nick$=Left$(nu_nick$,16)
  Locate 20,80
  nu_max$=Input$("Max. Number of Players? ")
  nmax=nu_max$
  If nmax<2 Then nmax=2
  If nmax>100 Then nmax=100

  nu_topic$=url_encode$(nu_topic$)
  nu_nick$=url_encode$(nu_nick$)
  
  Print "Trying to establish Host on Games Server..."
  AppTitle "Connecting..."
  game_nuhost(ip$,port,nu_topic$,nu_nick$,nmax)
  If iocount>start_content+1
   password$=io$(start_content+1)
   everr$=io$(start_content)
   hosting=1
  EndIf
  AppTitle status$
  If Len(everr$)>=5
   If Left$(everr$,5)="Error"
    AppTitle everr$
    hosting=0
   EndIf
  EndIf
  ; Some Test-Nicks for our Host - instead use your Games Nicks !!!
  nicks$(0)=nu_nick$
  nicks$(1)=url_encode$("Superman")
  nicks$(2)=url_encode$("Obi van")
  nicks$(3)=url_encode$("Ronin")
  nicks$(4)=url_encode$("Morpheus")
  nicks$(5)=url_encode$("Gorbi")
  nnicks=5 ; number of nicks -1 (important!)
 EndIf

; Add your Game-Connection Initialisation here ()


While KeyDown(1)<>0:VWait:Wend

; ---------------------------------GAME-------------------------------
tt=MilliSecs()+list_upd_time
While KeyDown(1)=0
 Cls
 Text 200,200,"I am a Game :).  Hosting: "+hosting+"  Joining: "+joining+"."
 ;
 ;  Here is your Game, doing all kinds of stuff
 ;
 If hosting=1
  If MilliSecs()>tt ; update Game List frequently to remain in the Host List AND after Chanches.
   game_update(ip$,port,password$,nmax,nnicks)
   tt=MilliSecs()+list_upd_time
  EndIf
 EndIf

 Flip
Wend

If hosting=1
 game_quit(ip$,port,password$) ; do this only when none of the other Players is the new Host
EndIf

End
; Please note: The Host is using a Password to update the List on the IP Management Server.
; If the Host disconnects and a Client will continue Hosting then the old Host should tell
; the new Host the Password before disconnecting to enable the new Host to do the Update Job.
; You can also tell the Password to the next Client from beginning on - to make shure the
; Game can be continued even if the old Host was disconnected by accident.

; You have to update your Nick List and the Variable 'nnicks'(number of nicks) before you 
; call'game_update()'. The first Nick in the List should be the Hosts Nickname.






;------------------------------------------------------------------------------------
;                            REQUEST FOR HOSTED GAMES IP-LIST
;------------------------------------------------------------------------------------
; This will ask the IP Management Server for a list. It will also force the Server to delete 
; Hosts which have a Timeout. It is accessed with http GET as follows:
; http://127.0.0.1/cgi-bin/list_games.pl?action=list
Function game_list$(ip$,port)
 tcp=OpenTCPStream(ip$,port )
 If  tcp
  Status$="Error: Connection to "+ip$+" failed"
   WriteLine tcp,"GET /cgi-bin/list_games.pl?action=list HTTP/1.1"
   WriteLine tcp,"Host: krokant.tripod.com"
   WriteLine tcp,"User-Agent: BlitzBrowser"
   WriteLine tcp,"Accept: */*"
   WriteLine tcp,""

   If Eof(tcp)
     Status$="Error: Connection "+ip$+" does not answer"
   EndIf
  For i=0 To 1000
   io$(i)=""
  Next
  iocount=0
  wr=WriteFile("rappi.txt")
  While Not Eof(tcp)
    io$(iocount)= ReadLine$( tcp )
    Print io$(iocount)
    WriteLine wr,io$(iocount)
   iocount=iocount+1
  Wend
  CloseFile wr

  If Eof(tcp)=1 Then 
    Status$="Connected"
  Else
    Status$="Error: EOF not reached"
  EndIf
  CloseTCPStream tcp
Else
 Status$="Error: Connection to "+ip$+" failed"
EndIf
Return status$

End Function






;------------------------------------------------------------------------------------
;                          BB-CLIENT WANTS TO BE A NEW BB-HOST
;------------------------------------------------------------------------------------
; You choosed to be a New Host. Accessed by http GET as follows:
; http://127.0.0.1/cgi-bin/list_games.pl?action=nuhost&nick=harry&topic=Capture%20flag!&max=10
;                                            action 0   nick 1   topic 2       max players 3
Function game_nuhost(ip$,port,lnu_topic$,lnu_nick$,lnmax)
 tcp=OpenTCPStream(ip$,port )
 If  tcp
  Status$="Error: Connection to "+ip$+" failed"
  WriteLine tcp,"GET /cgi-bin/list_games.pl?action=nuhost&nick="+lnu_nick$+"&topic="+lnu_topic$+"&max="+Str$(lnmax)+" HTTP/1.1"
  WriteLine tcp,"Host: krokant.tripod.com"
  WriteLine tcp,"User-Agent: BlitzBrowser"
  WriteLine tcp,"Accept: */*"
  WriteLine tcp,""
   If Eof(tcp)
     Status$="Error: Connection "+ip$+" does not answer"
   EndIf
  For i=0 To 1000
   io$(i)=""
  Next
  iocount=0
  While Not Eof(tcp)
    io$(iocount)= ReadLine$( tcp )
   iocount=iocount+1
  Wend

  If Eof(tcp)=1 Then 
    Status$="Connected"
  Else
    Status$="Error: EOF not reached"
  EndIf
  CloseTCPStream tcp
Else
 Status$="Error: Connection to "+ip$+" failed"
 If iocount>0
  
 EndIf
EndIf
Return status$

End Function








;------------------------------------------------------------------------------------
;                      SEND UPDATED INFO TO IP MANAGEMENT SERVER
;------------------------------------------------------------------------------------
; Your Games Hosts request To update its Games Information in the list od the Server. Accessed 
; by http GET:
; http://127.0.0.1/cgi-bin/list_games.pl?action=update&pass=7777777&max=12&n1=harry&n2=suzi&n3=rocky&n4=e_o
;                                            action=0      password=1   max.players=2   all nicks (host First)       "e_o"= End mark            
Function game_update(ip$,port,pw$,lnmax,nnicks)
 tcp=OpenTCPStream(ip$,port )
 If  tcp
  allnicks$=""  ; assemble all nicks + end-label
  For i=0 To nnicks
   allnicks$=allnicks$+"&n"+Str$(1+i)+"="+nicks$(i)
  Next
  allnicks$=allnicks$+"&n"+Str$(1+i)+"="+"e_o"
  Status$="Error: Connection to "+ip$+" failed"
  WriteLine tcp,"GET /cgi-bin/list_games.pl?action=update&pass="+pw$+"&max="+Str$(lnmax)+allnicks$+" HTTP/1.1"
  WriteLine tcp,"Host: krokant.tripod.com"
  WriteLine tcp,"User-Agent: BlitzBrowser"
  WriteLine tcp,"Accept: */*"
  WriteLine tcp,""
   If Eof(tcp)
     Status$="Error: Connection "+ip$+" does not answer"
   EndIf
  For i=0 To 1000
   io$(i)=""
  Next
  iocount=0
  While Not Eof(tcp)
    io$(iocount)= ReadLine$( tcp )
   iocount=iocount+1
  Wend

  If Eof(tcp)=1 Then 
    Status$="Connected"
  Else
    Status$="Error: EOF not reached"
  EndIf
  CloseTCPStream tcp
Else
 Status$="Error: Connection to "+ip$+" failed"
EndIf
Return status$

End Function




;------------------------------------------------------------------------------------
;                          QUIT GAME, REMOVE HOST FROM LIST
;------------------------------------------------------------------------------------
; Your Games Hosts Request to be removed from the Server List. Accessed  by http GET:

; http://127.0.0.1/cgi-bin/list_games.pl?action=byebye&pass=7777777
;                                            action=0      password=1
Function game_quit(ip$,port,pw$)
 tcp=OpenTCPStream(ip$,port)
 If  tcp
  Status$="Error: Connection to "+ip$+" failed"
  WriteLine tcp,"GET /cgi-bin/list_games.pl?action=byebye&pass="+pw$+" HTTP/1.1"
  WriteLine tcp,"Host: krokant.tripod.com"
  WriteLine tcp,"User-Agent: BlitzBrowser"
  WriteLine tcp,"Accept: */*"
  WriteLine tcp,""
   If Eof(tcp)
     Status$="Error: Connection "+ip$+" does not answer"
   EndIf
  For i=0 To 1000
   io$(i)=""
  Next
  iocount=0
  While Not Eof(tcp)
    io$(iocount)= ReadLine$( tcp )
   iocount=iocount+1
  Wend

  If Eof(tcp)=1 Then 
    Status$="Disconnected successfully"
  Else
    Status$="Error: EOF not reached"
  EndIf
  CloseTCPStream tcp
Else
 Status$="Error: Disconnection from "+ip$+" failed"
EndIf
Return status$

End Function






; ----------------------------------------------------------------------------
; this will End Program with an Errormessage:
Function errexit(err$)
 ; Cls
  Print err$
  Flip
  WaitKey()
  End
End Function


; ----------------------------------------------------------------------------
Function url_encode$(t$)
  tem$=""
  For i=1 To Len(t$)
   a=Asc(Mid$(t$,i,1))
   If a = 32
    tem$=tem$+"+"
    Goto my_end_select
   EndIf
   If (a<48)Or(a>57 And a<64)Or((a>=91) And (a<=96))Or(a>=123)
    tem$=tem$+"%"+Right$(Hex$(a),2)
    Goto my_end_select
   EndIf
   tem$=tem$+Chr$(a)
   .my_end_select
  Next
  Return tem$
End Function
; ----------------------------------------------------------------------------
;                          END OF TEST IP MANAGEMENT
; ----------------------------------------------------------------------------cut here..............................

Comments

None.

Code Archives Forum