Dave wrote:
Opps!

Just realized that the IP Addresses are wrong in the example, in the real app it's ok. I forgot that my router munges the the LAN IP Addresses, so where I've put 192.168.1.101, read 192.168.1.87 and where 192.168.1.102 read 192.168.1.105.

Another question is:

Why do I get a read error and not a write error:

socketError: 192.168.1.87:6000|looktowindward Error 54 reading socket

I'm not reading on the Client, I'm trying to try data.

You don't get a read error. You get a socket error (-- Connection reset by peer. This occurs when an established connection is shut down for some reason by the remote computer.) which the error string misleadingly indicates was a read error. This probably comes from your system (which OS etc. are you using ?), and is merely passed along by Rev.

It probably does happen when you try to write to the socket after it has been closed.

I'd recommend adding a 'socketClosed' handler and see if that helps ...


Questions:

Why do I sometimes not get a socketError or a socketTimeout ?

Why does it sometimes repeat (as it should) for a few times and then stop?

Don't know :-( but try adding the socketClosed handler and see if that helps. I have also asked some questions / made some suggestions below.
If it doesn't, resend this log
Here is the code:

The mouseUp handler are in the main stack of the app and the


The following is including in the App using the "start using" command:


--  StartServer

function StartServer theServerPortNumber,theClientAllowList

  get DebugLogString("StartServer - Accept:" && theServerPortNumber)

  put theClientAllowList into sgServerClientAllowList
accept connections on theServerPortNumber with message "ServerContactedByClient"

  return empty
end StartServer


--  ServerContactedByClient

on ServerContactedByClient theIPAddress
  local myClientIPAddress
  local myResult

  put the result into myResult

what do you expect 'the result' to contain at this point ?
get DebugLogString("ServerContactedByClient:" && theIPAddress && myResult)

  if myResult <> empty then
    breakpoint
    exit ServerContactedByClient
  end if

  set the itemDelimiter to ":"
  put item 1 of theIPAddress into myClientIPAddress

if myClientIPAddress is not among the lines of sgServerClientAllowList then get DebugLogString("ServerContactedByClient, Bad Client:" && theIPAddress)
    close socket theIPAddress
I'd recommend a 'exit ServerContactedByClient" at this point - otherwise you are about to read from a socket you just closed.
  end if

read from socket theIPAddress for kPacketCountSize chars with message "ServerReceivedPacketSize"

end ServerContactedByClient



--  ServerReceivedPacketSize

on ServerReceivedPacketSize theIPAddress,thePacketSize
  local myResult
  local myPacketData
  local myPacketID
  local myPacketCommand
  local myConnectionID

  put the result into myResult

again, what do you expect in 'the result' here ?
get DebugLogString("ServerReceivedPacketSize:" && theIPAddress && thePacketSize && myResult)

  if myResult <> empty then
    get DebugLogString("ServerReceivedPacketSize, Error:" && myResult)
    breakpoint
  end if

  read from socket theIPAddress for thePacketSize chars
  put the result into myResult
  put it into myPacketData

Note this is a blocking read. That will normally work OK (since the client sends the packet size followed by the data), but it is not robust. If the client was forced to split the data into different packets (e.g. if the data was relatively large), and the subsequent packet was lost in the network (i.e needed to be NAK'ed and then retransmitted), then this could cause your handler to block for an arbitrarily long period - up to the timeout interval.

It's up to you, but I would NEVER do a blocking read - I'd simply do

read from socket theIPAddress for thePacketSize chars with message "ServerReceivedPacketData"

and put most of the following code into that new handler (finishing, of course with another "read from ... ServerReceivedPacketSize")
get DebugLogString("ServerReceivedPacketSize, Packet Data:" && myPacketData && myResult)

  if myResult <> empty then
    get DebugLogString("ServerReceivedPacketSize, Error:" && myResult)
    breakpoint
  end if

  --
  --  Get the Message Content
  --
  put item 1 of myPacketData into myPacketID
  put item 2 of myPacketData into myPacketCommand

  if myPacketID = "$SYS" then
    if myPacketCommand = "Connect" then
      put item 3 of myPacketData into myConnectionID

     end if

  end if

end ServerReceivedPacketSize


--  StartClient

function StartClient theServerList,theConnectionID

  set the socketTimeoutInterval to (2 * 1000)
  put theServerList into sgConnectToServerList
  repeat for each line myIPAddress in sgConnectToServerList
    send "StartOneClient myIPAddress,theConnectionID" to me in 0 seconds
  end repeat

  return empty
end StartClient

I notice that StartOneClient really only does 'open socket' (which is non-blocking, since you specify a callback handler) and therefore is very quick, so unless you expect very large lists of servers, you could simplify this and not bother with the send message, just call the handler directly. No problem doing it the way you have done - just want to point out the non-blocking (and hence speedy) nature of "open socket".


--  StartOneClient

on StartOneClient theIPAddress,theConnectionID
  local myServerIPAddress
  local myServerPortNumber
  local mySocketAddress
  local myConnectString
  local myPacketSize
  local myResult

put _DecodeIPAddress(theIPAddress,myServerIPAddress,myServerPortNumber) into myResult
  if myResult <> empty then
get DebugLogString("StartOneClient - IP Address Error:" && theIPAddress && myResult)
    breakpoint
    exit StartOneClient
  end if

put myServerIPAddress & ":" & myServerPortNumber & "|" & theConnectionID into mySocketAddress

get DebugLogString("StartOneClient - Connect:" && mySocketAddress && myResult)

  open socket mySocketAddress with message "ClientSocketOpen"
  put the result into myResult
I don't believe 'the result' has anything useful here, since you specified a callback handler.
  if myResult <> empty then
get DebugLogString("StartOneClient - Write Socket Count Error:" && mySocketAddress && myPacketSize && myResult)
    breakpoint
    exit StartOneClient
  end if

end StartOneClient


--

Alex Tweedly      mailto:[EMAIL PROTECTED]      www.tweedly.net

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to