TP_AIPS/TP-AIPS-2024-ALNET-Paul-preparation-v1-v4.md

3.3 KiB

Use shift + K in vim/nvim to open the man page of function undor cursor.

tsock_v1 pseudo-code : UDP only

parse and validate arguments.
fail if requests TCP

if source:
  build local socket -> socket()
  build and resolve destination address -> gethostbyname()
  for loop:
      construire_message()
      send datagrams -> sendto()
  exit()
else:    # puit
  build local socket -> socket()
  build address -> INADDR_ANY
  bind socket to address -> bind()
  while True:   # receive unlimited messages
    receive datagram -> recvfrom()
    afficher_message()

tsock_v2 pseudo-code : UDP/TCP

parse and validate arguments.

if source:
  build local socket -> socket()
  build and resolve destination address -> gethostbyname()
  if TCP:
    open connection to receiver -> connect()
    for loop:
      construire_message()
      send message -> send()
    close connection -> close()
  else:  # UDP
    same as in v1
  exit()
else:    # puit
  build local socket -> socket()
  build address -> INADDR_ANY
  bind socket to address -> bind()
  if TCP :
    set incoming connection queue size -> listen()
    while True:   # receive unlimited connections (one at a time)
      accept an incoming connection -> accept()
      while connection open and new message:
        read incoming stream -> read()
        afficher_message()
      # connection closed by emitter
  else :
    same as in v1

EDIT : Turns out v3/v4 pseudocode isn't required. For your viewing pleasure.

tsock_v3 pseudo-code : UDP/TCP with custom length & number of messages

Pretty much the same as tsock_v2 but buffer sizes are dynamically allocated (implies changes in parameters to read/write functions). Also changes the number of iterations in the for loops.

tsock_v4 pseudo-code : Standalone server

UDP implies on the client listener side sending a hello packet to server to request data. how to know last packet ?

TODO

parse and validate arguments.

void send_messages():
  for loop:
    construire_message()
    send message -> send()

if client:
  build local socket -> socket()
  build and resolve destination address -> gethostbyname()
  if TCP:
    open connection to server -> connect()
    if emitter:
      send_messages()
      close()
    else:  # receiver
      while connection open:
        read()
        afficher_message()
  if UDP:
    if emitter:
      send_messages()
    else:
      send datagram to request data -> send()
      while True: # exit condition ??
        read()
        afficher_message()

else:  # server
  build local socket -> socket()
  build address -> INADDR_ANY
  bind socket to address -> bind()
  if TCP:
    while True:
      accept() produces new connection socket
      fork() 
      close(listening socket) on child
      close(new connection socket) on parent
      # within child process
      if emitter:
        send_messages()
        close()
      else:  # receiver
        while connection open:
          read()
          afficher_message()
      exit() on child
  else:  # UDP
    if emitter:
      while read():  # receive request datagram
        fork()
        # on child
        build socket if required
        send_messages()
    else:  # receiver
      while True:
        read()
        afficher_message()

When as a TCP server, we may want to reap the dead children processes using waitpid() and errno.