'-------------------------------------------------------------------------------
'                          SERVERTEST.BAS
'                    (c) 2002-2003 MCS Electronics
'   start the easytcp.exe program after the chip is programmed and create 2 connections
'-------------------------------------------------------------------------------

$regfile = "M161def.dat"
$crystal = 4000000
$baud = 19200

Const Sock_stream = $01                 ' Tcp
Const Sock_dgram = $02                  ' Udp
Const Sock_ipl_raw = $03                ' Ip Layer Raw Sock
Const Sock_macl_raw = $04               ' Mac Layer Raw Sock
Const Sel_control = 0                   ' Confirm Socket Status
Const Sel_send = 1                      ' Confirm Tx Free Buffer Size
Const Sel_recv = 2                      ' Confirm Rx Data Size

'socket status
Const Sock_closed = $00                 ' Status Of Connection Closed
Const Sock_arp = $01                    ' Status Of Arp
Const Sock_listen = $02                 ' Status Of Waiting For Tcp Connection Setup
Const Sock_synsent = $03                ' Status Of Setting Up Tcp Connection
Const Sock_synsent_ack = $04            ' Status Of Setting Up Tcp Connection
Const Sock_synrecv = $05                ' Status Of Setting Up Tcp Connection
Const Sock_established = $06            ' Status Of Tcp Connection Established
Const Sock_close_wait = $07             ' Status Of Closing Tcp Connection
Const Sock_last_ack = $08               ' Status Of Closing Tcp Connection
Const Sock_fin_wait1 = $09              ' Status Of Closing Tcp Connection
Const Sock_fin_wait2 = $0a              ' Status Of Closing Tcp Connection
Const Sock_closing = $0b                ' Status Of Closing Tcp Connection
Const Sock_time_wait = $0c              ' Status Of Closing Tcp Connection
Const Sock_reset = $0d                  ' Status Of Closing Tcp Connection
Const Sock_init = $0e                   ' Status Of Socket Initialization
Const Sock_udp = $0f                    ' Status Of Udp
Const Sock_raw = $10                    ' Status of IP RAW



$lib "tcpip.lbx"                        ' specify the tcpip library
Print "Init , set IP to 192.168.0.8"    ' display a message
Enable Interrupts                       ' before we use config tcpip , we need to enable the interrupts
Config Tcpip = Int0 , Mac = 12.128.12.34.56.78 , Ip = 192.168.0.8 , Submask = 255.255.255.0 , Gateway = 0.0.0.0 , Localport = 1000 , Tx = $55 , Rx = $55

'Use the line below if you have a gate way
'Config Tcpip = Int0 , Mac = 12.128.12.34.56.78 , Ip = 192.168.0.8 , Submask = 255.255.255.0 , Gateway = 192.168.0.1 , Localport = 1000 , Tx = $55 , Rx = $55

Dim Bclient As Byte                     ' socket number
Dim Idx As Byte
Dim Result As Word                      ' result
Dim S As String * 80
Dim Flags As Byte
Dim Peer As Long

Declare Function Ipnum(ip As Long) As String

Do
  For Idx = 0 To 3
     Result = Socketstat(idx , 0)       ' get status
     Select Case Result
       Case Sock_established
            If Flags.idx = 0 Then       ' if we did not send a welcome message yet
               Flags.idx = 1
               Result = Tcpwrite(idx , "Hello from W3100A{013}{010}")       ' send welcome
            End If
            Result = Socketstat(idx , Sel_recv)       ' get number of bytes waiting
            If Result > 0 Then
               Do
                 Result = Tcpread(idx , S)
                 Print "Data from client: " ; Idx ; " " ; S
                 Peer = Getdstip(idx)
                 Print "Peer IP " ; Ipnum(peer)
                 'you could analyse the string here and send an appropiate command
                 'only exit is recognized
                 If Lcase(s) = "exit" Then
                    Closesocket Idx
                 Elseif Lcase(s) = "time" Then
                    Result = Tcpwrite(idx , "12:00:00{013}{010}")       ' you should send date$ or time$
                 End If
               Loop Until Result = 0
            End If
       Case Sock_close_wait
            Print "close_wait"
            Closesocket Idx
       Case Sock_closed
            Print "closed"
            Bclient = Getsocket(idx , Sock_stream , 5000 , 0)       ' get socket for server mode, specify port 5000
            Print "Socket " ; Idx ; " " ; Bclient
            Socketlisten Idx
            Print "Result " ; Result
            Flags.idx = 0               ' reset the hello message flag
     End Select
  Next
Loop

'this function can be used to display an IP number in normal format
Function Ipnum(ip As Long) As String
    Local T As Byte , J As Byte
    Ipnum = ""
    For J = 1 To 4
      T = Ip And 255
      Ipnum = Ipnum + Str(t)
      If J < 4 Then Ipnum = Ipnum + "."
      Shift Ip , Right , 8
    Next
End Function

End