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.
code = %recvfrom(socket, buffer, bufferLength, flags, &sourceAddress, &port)
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. |
* * 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 )