%recvfrom() Function

The %recvfrom() function receives a datagram from a bound socket and stores the information on the sender. If no errors occur, the number of bytes received is returned.

Syntax

code = %recvfrom(socket, buffer, bufferLength, flags, &sourceAddress, &port)

Parameter(s)

socket

File descriptor for the local socket.

buffer

Data to be received.

bufferLength

Maximum length of the buffer.

flags

Should be zero.

sourceAddress

Address of the sender.

port

Port number of the sender.

Example(s)

*

* Open a connection through UDP/IP.

*   recv packets from the network execute the command

*   and send result packets back

*

cfunction socket.builtin

include dm,bp,includes sysid.inc

include dm,bp,unix.h socket.h

equ ip_port to 3176

*

* Create a socket

fd=%socket( AF$INET, SOCK$DGRAM, 0)

if fd<0 then print "Error opening socket ":system(0); stop

*

* Bind the socket to an ethernet port

port=%bind( fd, AF$INET, INADDR$ANY, ip_port )

*

* Read buffers to get the command to execute

packcnt = 0

bigbuff = ""

loop

  addr=0;  port=0

  buffer = space(256)

  length=%recvfrom( fd, buffer, 256, 0, &addr, &port)

  if length<0 then print "Read Error: ":system(0)

  PackSeq = buffer[5,4]

  MaxPack = buffer[9,4]

  packcnt += 1

  bigbuff[1+((PackSeq-1)*242),242] = buffer[13,242]

until packcnt = MaxPack do repeat

*

* execute the command

execute bigbuff capturing ret

*

* get the byteswapped remote address

remhost = ""

addr = dtx(addr)

lad = len(addr)

addr = xtd(addr[lad-7,8])

for x = 1 to 4

  part = rem(addr,256)

  addr = int(addr/256)

  remhost<-1>= part

next x

convert @AM to '.' in remhost

*

ln = len(ret)

MaxPack = int(ln/242)+1

for x = 1 to MaxPack

  Buffer = "RETC":x 'r%4':MaxPack 'r%4':ret[((x-1)*242)+1,242]:space(242)

  n = %sendto(fd, Buffer, 256, 0, &remhost, ip_port)

  if n < 0 then

    print "Write error: ":system(0)

  end

next x

*

* Close the socket

%close( fd )