Thanks again, Alex. I had already checked out your examples to see how the UDP sockets worked in Rev (very valuable resource - ta) - maybe I'm making things sound more complicated than they are! The thing works fine using the default port for the unit, I'll upload the code into my user space in case anyone else is interested in this bit of kit.

JC

Alex Tweedly wrote:

John Craig wrote:

Alex Tweedly wrote:

I don't know of a way to do this directly - certainly nothing I can see in the docs, and haven't seen it done.

There is a pretty nasty (but generally effective) way to do it .....




Thanks, Alex. The reason I asked was that I have hooked up an Aviosys IP POWER 9200 box to a network. It has digi inputs and outputs for controlling mains appliances. You can set the port that it accepts data on, but it always replies on another port, so the handler for UDP replies never gets called. I thought if I could determine the local port used I could then listen for the reply data. I'm just using the default port that it sends the replies to and it's working fine.


No, you really don't need to do that John (and indeed, you can't do that :-).

The docs are pretty unclear (OK, they're *absolutely* hopeless) about this. The docs say

Establishes a TCP communications socket between your system and another system.

open [datagram] socket [to] host[:port[|ID]] [with message callbackMessage] open secure socket [to] host[:port[|ID]] [with message callbackMessage] [with|without verification] [using certificate certificate and key key]

<snip>

Description
Use the open socket command to open a connection to another system on the Internet (or another IP network) to get and send data.

Parameters:
The host is the IP address or domain name of the host you want to connect to.

The port is the port number you want to connect to. If you don't specify a port, port 80 is used. (On most systems, port 80 is used for HTTP connections.)

The ID is an optional connection name for the socket, and can be any string. Specify an ID if you want to create more than one socket to the same host and port number, so that you can distinguish between them.

The callbackMessage is the name of a message to be sent **when the connection is made**.

Comments:
When a connection is made, the open socket command creates a new socket that can be used to communicate with the other system. The handler continues executing while the connection is being established. If you use the write to socket command while the connection is opening, the data is buffered and is sent to the host as soon as the connection is made.

Use the open datagram socket form if you want to send a connectionless UDP datagram instead of opening a socket.

If you specify a callbackMessage, the message is sent to the object whose script contains the open socket command, *as soon as the connection is made*. The first parameter pf this message is the host and port number of the socket. Use a callbackMessage to trigger actions (such as reading from the socket) that must wait until the connection has been established. (To pause the handler that contains the open socket command until the callbackMessage is received, use the wait for messages form of the wait command.)


This describes the "callbackMessage" parameter correctly for TCP sockets (i.e. open socket)., but is totally misleading for UDP sockets (i.e. open datagram socket).

For UDP sockets, the callbackMessage parameter is the name of the handler which will be called when (if) any reply packets are received. This kind of makes sense (there is no "connection" as such, so no need for a callback when a connection is opened, and there is a need to be told when reply packets arrive - and this is a better way than telling you which local port was assigned, since you;d need to *then* accept packets on it, which would be a race condition between the accept command and the packets getting to/from the other machine).

So it should be that all you need to do is

 -- open datagram socket: UDP is connectionless, so no network activity
 --      is required for this open - hence it will complete immediately.
-- the message callback is used to receive any replies to packets sent over this socket
 open datagram socket to lHostPort with message "gotReplyPacket"

...

on gotReplyPacket pOtherOne
 mylog "Packet arrived" && paramCount()
 repeat with i=1 to paramCount()
   mylog i && ":" && param(i)
 end repeat
end gotReplyPacket

(See the RevonLine example under alextweedly - UDP client and UDP server)




_______________________________________________
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