Lecture Notes for Client-Server Interfaces

26 February 2004 - Project 1b Code Review


Outline


Requirements


Server Design


Complications


Redesign


Process-Based Concurrency

static void reaper(int sig)
  while (wait3(NULL, WNOHANG, NULL) > 0) { }
  signal(SIGCHLD, reaper)

int main(int argc, char * argv[])

  signal(SIGCHLD, reaper)
  ms = tcp_srvr_open(port)

  while true
    ss = accept_tcp(ms)
    switch fork()
      case 0
	close(ms)
	handle_client(ss)
	return EXIT_SUCCESS
      case -1
	errexit("fork() failed:")
      default
	(void) close(ss)

  return EXIT_SUCCESS


Thread-Based Concurrency

int main(int argc, char * argv[])

  ms = tcp_srvr_open(port)

  pthread_t th
  pthread_attr_t ta
  pthread_attr_setdetachstate(&ta, DETACHED)
  
  while true
    ss = accept_tcp(ms)
    create_pthread(th, ta, handle_client, ss)

  return EXIT_SUCCESS


Iterative-Based Concurrency

handle_client(skt, msg-info)
  
int main(int argc, char * argv[])

  const int ls = srvr-tcp-open(port)
  skt-set::add(ls)

  while true
    skts = skt-set::ready()
    for s = skts
      if s == ls
        s = accept_tcp(ls)
        skt-set::add(s)
	msg-map[s] = new-msg
      else
        handle_client(s, msg-map[s])

  return EXIT_SUCCESS


Tests


Problems


TCP is a Stream Protocol


A Looping Read Problem


Points to Remember


This page last modified on 3 March 2004.