maxMsg

Two models run in a client-server, remote procedure call (RPC) communication pattern. The client model maxMsgCli sends requests and receives response to/from the server model maxMsgSrv via the deprecated rpcCall method (use call instead). The server model receives requests and send responses. This example demostrates the RPC pattern through the use of the client_of and is_server model parameters and the RPC interface classes/functions.

Mixed Version

Model Code:

 1import sys
 2import random
 3from yggdrasil.interface.YggInterface import YggRpcClient, YGG_MSG_BUF
 4
 5
 6def rand_str(length):
 7    charset = ("0123456789"
 8               + "abcdefghijklmnopqrstuvwxyz"
 9               + "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
10    out = ''
11    while (len(out) < (length - 1)):
12        index = int(random.random() * len(charset))
13        out += charset[index]
14    if sys.version_info[0] == 3:
15        out = out.encode("utf-8")
16    return out
17
18
19msg_size = YGG_MSG_BUF
20
21print("maxMsgCli(P): Hello message size %d." % msg_size)
22
23# Create a max message, send/recv and verify
24rpc = YggRpcClient("maxMsgSrv_maxMsgCli", "%s", "%s")
25
26# Create a max message
27output = rand_str(msg_size)
28
29# Call RPC server
30ret, input = rpc.rpcCall(output)
31if not ret:
32    raise RuntimeError("maxMsgCli(P): RPC ERROR")
33
34# Check to see if response matches
35if (input[0] != output):
36    raise RuntimeError("maxMsgCli(P): ERROR: input/output do not match")
37else:
38    print("maxMsgCli(P): CONFIRM")
39
40# All done, say goodbye
41print("maxMsgCli(P): Goodbye!")
 1disp('maxMsgSrv(M): Hello!');
 2
 3rpc = YggInterface('YggRpcServer', 'maxMsgSrv', '%s', '%s');
 4
 5while (1)
 6  [flag, vars] = rpc.recv();
 7  if (~flag)
 8    break;
 9  end
10  fprintf('maxMsgSrv(M): rpcRecv returned %d, input %.10s...\n', ...
11	  flag, char(vars{1}));
12  flag = rpc.send(vars{1});
13  if (~flag)
14    error('maxMsgSrv(M): Error sending reply.');
15  end
16end
17
18disp('maxMsgSrv(M): Goodbye!');

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: PythonModelDriver
6  args: ./src/maxMsgCli.py
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: MatlabModelDriver
6  args: ./src/maxMsgSrv.m
7  is_server: True

Mixed w/o Matlab Version

Model Code:

 1import sys
 2import random
 3from yggdrasil.interface.YggInterface import YggRpcClient, YGG_MSG_BUF
 4
 5
 6def rand_str(length):
 7    charset = ("0123456789"
 8               + "abcdefghijklmnopqrstuvwxyz"
 9               + "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
10    out = ''
11    while (len(out) < (length - 1)):
12        index = int(random.random() * len(charset))
13        out += charset[index]
14    if sys.version_info[0] == 3:
15        out = out.encode("utf-8")
16    return out
17
18
19msg_size = YGG_MSG_BUF
20
21print("maxMsgCli(P): Hello message size %d." % msg_size)
22
23# Create a max message, send/recv and verify
24rpc = YggRpcClient("maxMsgSrv_maxMsgCli", "%s", "%s")
25
26# Create a max message
27output = rand_str(msg_size)
28
29# Call RPC server
30ret, input = rpc.rpcCall(output)
31if not ret:
32    raise RuntimeError("maxMsgCli(P): RPC ERROR")
33
34# Check to see if response matches
35if (input[0] != output):
36    raise RuntimeError("maxMsgCli(P): ERROR: input/output do not match")
37else:
38    print("maxMsgCli(P): CONFIRM")
39
40# All done, say goodbye
41print("maxMsgCli(P): Goodbye!")
 1#include "YggInterface.h"
 2#include <stdio.h>
 3
 4
 5int main(int argc, char *argv[]) {  
 6
 7    printf("maxMsgSrv(C): Hello!\n");
 8    yggRpc_t rpc = yggRpcServer("maxMsgSrv", "%s", "%s");
 9    size_t input_size = YGG_MSG_BUF;
10    char *input = (char*)malloc(input_size);
11    //char input[YGG_MSG_BUF];
12
13    while (1) {
14      // Reset to size of buffer if not all utilized
15      if (input_size < YGG_MSG_BUF)
16	input_size = YGG_MSG_BUF;
17      
18      int ret = rpcRecvRealloc(rpc, &input, &input_size);
19      if (ret < 0)
20        break;
21      printf("maxMsgSrv(C): rpcRecv returned %d, input (size=%lu) %.10s...\n",
22	     ret, input_size, input);
23      ret = rpcSend(rpc, input, input_size);
24      if (ret < 0) {
25        printf("maxMsgSrv(C): SEND ERROR\n");
26        break;
27      }
28    }
29
30    printf("maxMsgSrv(C): Goodbye!\n");
31    free(input);
32    return 0;
33}
34

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: PythonModelDriver
6  args: ./src/maxMsgCli.py
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: GCCModelDriver
6  args: ./src/maxMsgSrv.c
7  is_server: True

C Version

Model Code:

 1#include "YggInterface.h"
 2#include <stdio.h>
 3
 4
 5void rand_str(char *dest, size_t length) {
 6  char charset[] = "0123456789"
 7    "abcdefghijklmnopqrstuvwxyz"
 8    "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 9  while (length-- > 1) {
10    size_t index = (size_t)((double) rand() / RAND_MAX * (sizeof charset - 1));
11    *dest++ = charset[index];
12  }
13  *dest = '\0';
14}
15
16
17int main(int argc, char *argv[]) {
18
19  //char output[YGG_MSG_BUF];
20  //char input[YGG_MSG_BUF];
21  size_t msg_size_output = YGG_MSG_BUF;
22  size_t msg_size_input = YGG_MSG_BUF;
23  char *output = (char*)malloc(msg_size_output);
24  char *input = (char*)malloc(msg_size_input);
25
26  printf("maxMsgCli(C): Hello message size is %d.\n", (int)msg_size_output);
27  
28  // Create a max message, send/recv and verify
29  yggRpc_t rpc = yggRpcClient("maxMsgSrv_maxMsgCli", "%s", "%s");
30    
31  // Create a max message
32  rand_str(output, msg_size_output);
33  printf("maxMsgCli(C): sending %.10s...\n", output);
34    
35  // Call RPC server
36  if (rpcCallRealloc(rpc, output, msg_size_output-1,
37		     &input, &msg_size_input) < 0) {
38    printf("maxMsgCli(C): RPC ERROR\n");
39    free(output);
40    free(input);
41    return -1;
42  }
43  printf("maxMsgCli(C): received %lu bytes: %.10s...\n", msg_size_input, input);
44
45  // Check to see if response matches
46  if (strncmp(output, input, msg_size_output-1)) {
47    printf("maxMsgCli(C): ERROR: input/output do not match\n");
48    free(output);
49    free(input);
50    return -1;
51  } else {
52    printf("maxMsgCli(C): CONFIRM\n");
53  }
54
55  // All done, free and say goodbye
56  printf("maxMsgCli(C): Goodbye!\n");
57  free(output);
58  free(input);
59  return 0;
60}
61
 1#include "YggInterface.h"
 2#include <stdio.h>
 3
 4
 5int main(int argc, char *argv[]) {  
 6
 7    printf("maxMsgSrv(C): Hello!\n");
 8    yggRpc_t rpc = yggRpcServer("maxMsgSrv", "%s", "%s");
 9    size_t input_size = YGG_MSG_BUF;
10    char *input = (char*)malloc(input_size);
11    //char input[YGG_MSG_BUF];
12
13    while (1) {
14      // Reset to size of buffer if not all utilized
15      if (input_size < YGG_MSG_BUF)
16	input_size = YGG_MSG_BUF;
17      
18      int ret = rpcRecvRealloc(rpc, &input, &input_size);
19      if (ret < 0)
20        break;
21      printf("maxMsgSrv(C): rpcRecv returned %d, input (size=%lu) %.10s...\n",
22	     ret, input_size, input);
23      ret = rpcSend(rpc, input, input_size);
24      if (ret < 0) {
25        printf("maxMsgSrv(C): SEND ERROR\n");
26        break;
27      }
28    }
29
30    printf("maxMsgSrv(C): Goodbye!\n");
31    free(input);
32    return 0;
33}
34

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: GCCModelDriver
6  args: ./src/maxMsgCli.c
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: GCCModelDriver
6  args: ./src/maxMsgSrv.c
7  is_server: True

C++ Version

Model Code:

 1#include "YggInterface.hpp"
 2#include <stdio.h>
 3
 4
 5void rand_str(char *dest, size_t length) {
 6  char charset[] = "0123456789"
 7    "abcdefghijklmnopqrstuvwxyz"
 8    "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 9  while (length-- > 1) {
10    size_t index = (size_t)((double) rand() / RAND_MAX * (sizeof charset - 1));
11    *dest++ = charset[index];
12  }
13  *dest = '\0';
14}
15
16
17int main(int argc, char *argv[]) {
18
19    //char output[YGG_MSG_BUF];
20    //char input[YGG_MSG_BUF];
21    size_t msg_size_output = YGG_MSG_BUF;
22    size_t msg_size_input = YGG_MSG_BUF;
23    char *output = (char*)malloc(msg_size_output);
24    char *input = (char*)malloc(msg_size_input);
25  
26    printf("maxMsgCli(CPP): Hello message size is %d.\n", (int)msg_size_output);
27    
28    // Create a max message, send/recv and verify
29    YggRpcClient rpc("maxMsgSrv_maxMsgCli", "%s", "%s");
30    
31    // Create a max message
32    rand_str(output, msg_size_output);
33    printf("maxMsgCli(CPP): sending %.10s...\n", output);
34    
35    // Call RPC server
36    if (rpc.callRealloc(4, output, msg_size_output-1,
37			&input, &msg_size_input) < 0) {
38      printf("maxMsgCli(CPP): RPC ERROR\n");
39      free(output);
40      free(input);
41      return -1;
42    }
43    printf("maxMsgCli(CPP): received %lu bytes: %.10s...\n", msg_size_input, input);
44
45    // Check to see if response matches
46    if (strncmp(output, input, msg_size_output-1)) {
47        printf("maxMsgCli(CPP): ERROR: input/output do not match\n");
48        free(output);
49        free(input);
50	    return -1;
51    } else {
52        printf("maxMsgCli(CPP): CONFIRM\n");
53    }
54
55    // All done, say goodbye
56    printf("maxMsgCli(CPP): Goodbye!\n");
57
58    free(output);
59    free(input);
60    return 0;
61}
 1#include "YggInterface.hpp"
 2#include <stdio.h>
 3
 4
 5int main(int argc, char *argv[]) {  
 6
 7    printf("maxMsgSrv(CPP): Hello!\n");
 8    YggRpcServer rpc("maxMsgSrv", "%s", "%s");
 9    size_t input_size = YGG_MSG_BUF;
10    char *input = (char*)malloc(input_size);
11    //char input[YGG_MSG_MAX];
12    
13    while (1) {
14      int ret = rpc.recvRealloc(2, &input, &input_size);
15      if (ret < 0)
16	break;
17      printf("maxMsgSrv(CPP): rpcRecv returned %d, input (size=%lu) %.10s...\n",
18	     ret, input_size, input);
19      ret = rpc.send(2, input, input_size);
20      if (ret < 0) {
21        printf("maxMsgSrv(CPP): SEND ERROR");
22        break;
23      }
24    }
25
26    printf("maxMsgSrv(CPP): Goodbye!\n");
27    return 0;
28}

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: GCCModelDriver
6  args: ./src/maxMsgCli.cpp
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: GCCModelDriver
6  args: ./src/maxMsgSrv.cpp
7  is_server: True

Fortran Version

Model Code:

 1program main
 2  use fygg
 3
 4  integer(kind=c_size_t) :: msg_size_output = YGG_MSG_BUF
 5  integer(kind=c_size_t) :: msg_size_input = YGG_MSG_BUF
 6  character, dimension(YGG_MSG_BUF) :: output
 7  type(yggchar_r) :: input
 8  type(yggcomm) :: rpc
 9  logical :: ret
10
11  print *, "maxMsgCli(F): Hello message size is ", msg_size_output
12
13  ! Create a max message, send/recv and verify
14  rpc = ygg_rpc_client("maxMsgSrv_maxMsgCli", "%s", "%s")
15
16  ! Create a max message
17  call rand_str(output, msg_size_output)
18  print *, "maxMsgCli(F): sending ", output(1:10), "..."
19
20  ! Call RPC server
21  msg_size_input = size(input%x)
22  ret = ygg_rpc_call_realloc(rpc, &
23       [yggarg(output), yggarg(msg_size_output)], &
24       [yggarg(input), yggarg(msg_size_input)])
25  if (.not.ret) then
26     print *, "maxMsgCli(F): RPC ERROR"
27     stop 1
28  end if
29  print *, "maxMsgCli(F): received ", msg_size_input, " bytes: ", &
30       input%x(1:10), "..."
31
32  ! Check to see if response matches
33  if (.not.all(output.eq.(input%x))) then
34     print *, "maxMsgCli(F): ERROR: input/output do not match"
35     stop 1
36  else
37     print *, "maxMsgCli(F): CONFIRM"
38  end if
39
40  ! All done, free and say goodbye
41  print *, "maxMsgCli(F): Goodbye!"
42
43end program main
44
45subroutine rand_str(x, x_siz)
46  use fygg
47  character, dimension(*) :: x
48  real :: x_rand
49  integer(kind=c_size_t) :: x_siz, i, index
50  character(len=62) :: charset
51  charset = "0123456789&
52       &abcdefghijklmnopqrstuvwxyz&
53       &ABCDEFGHIJKLMNOPQRSTUVWXYZ"
54  do i = 1, x_siz
55     call random_number(x_rand)
56     index = int(x_rand * (len(charset) - 1), c_size_t) + 1
57     x(i) = charset(index:index)
58  end do
59  ! do i = (x_siz+1), size(x)
60  !    x(i) = ' '
61  ! end do
62end subroutine rand_str
63
 1program main
 2  use fygg
 3
 4  type(yggcomm) :: rpc
 5  integer(kind=c_size_t) :: input_size
 6  type(yggchar_r) :: input
 7  logical :: ret
 8
 9  print *, "maxMsgSrv(F): Hello!"
10  rpc = ygg_rpc_server("maxMsgSrv", "%s", "%s")
11
12  do while (.true.)
13     ! Reset to size of buffer if not all utilized
14     input_size = size(input%x)
15
16     ret = ygg_recv_var_realloc(rpc, [yggarg(input), yggarg(input_size)])
17     if (.not.ret) exit
18     print *, "maxMsgSrv(F): rpcRecv returned ", ret, ", input (size=", &
19          input_size, ") ", input%x(1:10)
20     ret = ygg_send_var(rpc, [yggarg(input), yggarg(input_size)])
21     if (.not.ret) then
22        print *, "maxMsgSrv(F): SEND ERROR"
23        exit
24     end if
25
26  end do
27
28  print *, "maxMsgSrv(F): Goodbye!"
29
30end program main

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: FortranModelDriver
6  args: ./src/maxMsgCli.f90
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: FortranModelDriver
6  args: ./src/maxMsgSrv.f90
7  is_server: True

Matlab Version

Model Code:

 1charset = ['0123456789', ...
 2	   'abcdefghijklmnopqrstuvwxyz', ...
 3	   'ABCDEFGHIJKLMNOPQRSTUVWXYZ'];
 4
 5
 6msg_size = YggInterface('YGG_MSG_BUF');
 7fprintf('maxMsgCli(M): Hello message size is %d.\n', msg_size);
 8
 9% Create a max message, send/recv and verify
10rpc = YggInterface('YggRpcClient', 'maxMsgSrv_maxMsgCli', '%s', '%s');
11
12% Create a max message
13output = string(randsample(charset, msg_size-1, true));
14
15% Call RPC server
16[flag, vars] = rpc.call(output);
17if (~flag)
18  error('maxMsgCli(M): RPC ERROR');
19end;
20
21% Check to see if response matches
22if (vars{1} ~= output)
23  error('maxMsgCli(M): ERROR: input/output do not match');
24else
25  disp('maxMsgCli(M): CONFIRM');
26end;
27
28% All done, say goodbye
29disp('maxMsgCli(M): Goodbye!');
 1disp('maxMsgSrv(M): Hello!');
 2
 3rpc = YggInterface('YggRpcServer', 'maxMsgSrv', '%s', '%s');
 4
 5while (1)
 6  [flag, vars] = rpc.recv();
 7  if (~flag)
 8    break;
 9  end
10  fprintf('maxMsgSrv(M): rpcRecv returned %d, input %.10s...\n', ...
11	  flag, char(vars{1}));
12  flag = rpc.send(vars{1});
13  if (~flag)
14    error('maxMsgSrv(M): Error sending reply.');
15  end
16end
17
18disp('maxMsgSrv(M): Goodbye!');

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: MatlabModelDriver
6  args: ./src/maxMsgCli.m
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: MatlabModelDriver
6  args: ./src/maxMsgSrv.m
7  is_server: True

Python Version

Model Code:

 1import sys
 2import random
 3from yggdrasil.interface.YggInterface import YggRpcClient, YGG_MSG_BUF
 4
 5
 6def rand_str(length):
 7    charset = ("0123456789"
 8               + "abcdefghijklmnopqrstuvwxyz"
 9               + "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
10    out = ''
11    while (len(out) < (length - 1)):
12        index = int(random.random() * len(charset))
13        out += charset[index]
14    if sys.version_info[0] == 3:
15        out = out.encode("utf-8")
16    return out
17
18
19msg_size = YGG_MSG_BUF
20
21print("maxMsgCli(P): Hello message size %d." % msg_size)
22
23# Create a max message, send/recv and verify
24rpc = YggRpcClient("maxMsgSrv_maxMsgCli", "%s", "%s")
25
26# Create a max message
27output = rand_str(msg_size)
28
29# Call RPC server
30ret, input = rpc.rpcCall(output)
31if not ret:
32    raise RuntimeError("maxMsgCli(P): RPC ERROR")
33
34# Check to see if response matches
35if (input[0] != output):
36    raise RuntimeError("maxMsgCli(P): ERROR: input/output do not match")
37else:
38    print("maxMsgCli(P): CONFIRM")
39
40# All done, say goodbye
41print("maxMsgCli(P): Goodbye!")
 1from yggdrasil.interface.YggInterface import YggRpcServer
 2
 3
 4print("maxMsgSrv(P): Hello!")
 5rpc = YggRpcServer("maxMsgSrv", "%s", "%s")
 6
 7while True:
 8    ret, input = rpc.rpcRecv()
 9    if not ret:
10        break
11    print("maxMsgSrv(P): rpcRecv returned %s, input %.10s..." % (ret, input[0]))
12    flag = rpc.rpcSend(input[0])
13    if not flag:
14        raise RuntimeError('maxMsgSrv(P): Error sending reply.')
15
16print("maxMsgSrv(P): Goodbye!")

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: PythonModelDriver
6  args: ./src/maxMsgCli.py
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: PythonModelDriver
6  args: ./src/maxMsgSrv.py
7  is_server: True

R Version

Model Code:

 1library(yggdrasil)
 2
 3
 4charset = strsplit("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", '')[[1]]
 5
 6msg_size = YggInterface('YGG_MSG_BUF')
 7fprintf("maxMsgCli(R): Hello message size %d.", msg_size)
 8
 9# Create a max message, send/recv and verify
10rpc <- YggInterface('YggRpcClient', "maxMsgSrv_maxMsgCli", "%s", "%s")
11
12# Create a max message
13output <- ygg_bytes(paste(sample(charset, msg_size, replace=TRUE), collapse=''))
14
15# Call RPC server
16c(ret, input) %<-% rpc$call(output)
17if (!ret) {
18  stop("maxMsgCli(R): RPC ERROR")
19}
20
21# Check to see if response matches
22if (input[[1]] != output) {
23  stop("maxMsgCli(R): ERROR: input/output do not match")
24} else {
25  print("maxMsgCli(R): CONFIRM")
26}
27
28# All done, say goodbye
29print("maxMsgCli(R): Goodbye!")
 1library(yggdrasil)
 2
 3
 4print("maxMsgSrv(R): Hello!")
 5rpc <- YggInterface('YggRpcServer', "maxMsgSrv", "%s", "%s")
 6
 7while (TRUE) {
 8  c(ret, input) %<-% rpc$recv()
 9  if (!ret) {
10    break
11  }
12  fprintf("maxMsgSrv(R): rpcRecv returned %s, input %.10s...", ret, input[[1]])
13  flag <- rpc$send(input[[1]])
14  if (!flag) {
15    stop('maxMsgSrv(R): Error sending reply.')
16  }
17}
18
19print("maxMsgSrv(R): Goodbye!")

Model YAML:

1---
2
3model:
4  name: maxMsgCli
5  driver: RModelDriver
6  args: ./src/maxMsgCli.R
7  client_of: maxMsgSrv
1---
2
3model:
4  name: maxMsgSrv
5  driver: RModelDriver
6  args: ./src/maxMsgSrv.R
7  is_server: True