+ All Categories
Home > Documents > COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

Date post: 22-Feb-2016
Category:
Upload: sailor
View: 38 times
Download: 0 times
Share this document with a friend
Description:
COMP 150-IDS: Internet Scale Distributed Systems (Fall 2013). COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints. Noah Mendelsohn Tufts University Email: [email protected] Web: http://www.cs.tufts.edu/~noah. What you should get from today’s session. - PowerPoint PPT Presentation
Popular Tags:
31
Copyright 2012, 2013 & 2015 – Noah Mendelsohn COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints Noah Mendelsohn Tufts University Email: [email protected] Web: http://www.cs.tufts.edu/~noah COMP 150-IDS: Internet Scale Distributed Systems (Spring 2016)
Transcript
Page 1: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

Copyright 2012, 2013 & 2015 – Noah Mendelsohn

COMP 150-IDSPing Demonstration Programs

&Makefile / C++ Hints

Noah MendelsohnTufts UniversityEmail: [email protected]: http://www.cs.tufts.edu/~noah

COMP 150-IDS: Internet Scale Distributed Systems (Spring 2016)

Page 2: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn2

What you should get from today’s session

A quick look at some details you’ll need to do our programming assignment, including:

The framework we’re using C++ Exceptions A tiny bit about inheritance Makefiles C/C++ tips and tricks

Page 3: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn3

Working through the Demo Client

Page 4: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Preamble

4

#include "c150dgmsocket.h"#include "c150debug.h"#include <fstream>

using namespace std; // for C++ std libraryusing namespace C150NETWORK;

Include Framework and Debug code

Page 5: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Preamble

5

#include "c150dgmsocket.h"#include "c150debug.h"#include <fstream>

using namespace std; // for C++ std libraryusing namespace C150NETWORK;

IMPORTANT!Needed for

COMP150IDS Framework!

Page 6: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn6

Main pingclient Logic

Page 7: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Client logic

7

try {

C150DgmSocket *sock = new C150DgmSocket();sock -> setServerName(argv[serverArg]);

sock -> write(argv[msgArg], strlen(argv[msgArg])+1);readlen = sock -> read(incomingMessage, sizeof(incomingMessage));

checkAndPrintMessage(readlen, incomingMessage, sizeof(incomingMessage)); } catch (C150NetworkException e) { cerr << argv[0] << ": caught C150NetworkException: " << e.formattedExplanation()

<< endl; }

This is not an ordinary socket…it’s a smart wrapper around a

socket Establishes us as a

client…and identifies the server…ports set

based on login id

Page 8: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Client logic

8

try {

C150DgmSocket *sock = new C150DgmSocket();sock -> setServerName(argv[serverArg]);

sock -> write(argv[msgArg], strlen(argv[msgArg])+1);readlen = sock -> read(incomingMessage, sizeof(incomingMessage));

checkAndPrintMessage(readlen, incomingMessage, sizeof(incomingMessage)); } catch (C150NetworkException e) { cerr << argv[0] << ": caught C150NetworkException: " << e.formattedExplanation()

<< endl; }

Clients write,then read

Page 9: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn9

Demo Server

Page 10: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Server logic

10

try { C150DgmSocket *sock = new C150DgmSocket(); c150debug->printf(C150APPLICATION,"Ready to accept messages"); while(1) {

readlen = sock -> read(incomingMessage, sizeof(incomingMessage)-1); // … WORK WITH MESSAGE HERE

string response = “SOME RESPONSE HERE”; sock -> write(response.c_str(), response.length()+1);}

} catch (C150NetworkException e) { c150debug->printf(C150ALWAYSLOG,"Caught C150NetworkException: %s\n",

e.formattedExplanation().c_str());}

Servers read, then write

Page 11: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Server logic

11

try { C150DgmSocket *sock = new C150DgmSocket(); c150debug->printf(C150APPLICATION,"Ready to accept messages"); while(1) {

readlen = sock -> read(incomingMessage, sizeof(incomingMessage)-1); // … WORK WITH MESSAGE HERE

string response = “SOME RESPONSE HERE”; sock -> write(response.c_str(), response.length()+1);}

} catch (C150NetworkException e) { c150debug->printf(C150ALWAYSLOG,"Caught C150NetworkException: %s\n",

e.formattedExplanation().c_str());}

Framework assumes responses go to

server/port from which we read

Page 12: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Inferring who is a server and who is a client

12

try { C150DgmSocket *sock = new C150NastyDgmSocket(nastiness); c150debug->printf(C150APPLICATION,"Ready to accept messages"); while(1) {

readlen = sock -> read(incomingMessage, sizeof(incomingMessage)-1); // … WORK WITH MESSAGE HERE

string response = “SOME RESPONSE HERE”; sock -> write(response.c_str(), response.length()+1);}

} catch (C150NetworkException e) { c150debug->printf(C150ALWAYSLOG,"Caught C150NetworkException: %s\n",

e.formattedExplanation().c_str());}

NOTE: The socket class imposes a simple notion of client/server on UDP…

It decides whether you’re a server or client based on which methods you call first

1) client calls setServer name then writes

2) server starts by doing a read.Note a very robust approach for production code, but

handy for these simple programs.

Page 13: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn13

C++ Inheritance

Page 14: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn14

A super-simple look at C++ Inheritanceclass Shape { private:

Point position; public: Point getPosition(); virtual void draw() = 0;};

Base class “Shape” has draw() method

with no implementation (=0)

Page 15: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn15

Class Circle : public Shape {public: virtual void draw();};

Class Square : public Shape {public:

virtual void draw();};

A super-simple look at C++ Inheritanceclass Shape { private:

Point position; public: Point getPosition(); virtual void draw() = 0;};

Each subclass provides its own

implementation of draw()

Page 16: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn16

A super-simple look at C++ InheritanceClass shape { private:

Point position; public: Point getPosition(); virtual void draw() = 0;};

Class Circle : public Shape {public: virtual void draw();};

Class Square : public Shape {public:

virtual void draw();};

Shape *shapeArray[2];int i;

shapeArray[0] = new Circle();shapeArray[1] = new Square();

for(i=0; i<2; i++) { cout << shapeArray[i] -> position;

shapeArray[i] -> draw();}

Both classes inherit postion() method from

parent

Page 17: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn17

A super-simple look at C++ InheritanceClass shape { private:

Point position; public: Point getPosition(); virtual void draw() = 0;};

Class Circle : public Shape {public: virtual void draw();};

Class Square : public Shape {public:

virtual void draw();};

Shape *shapeArray[2];int i;

shapeArray[0] = new Circle();shapeArray[1] = new Square();

for(i=0; i<2; i++) { cout << shapeArray[i] -> position;

shapeArray[i] -> draw();}

First time calls Circle::draw,

second time calls Square::draw

Page 18: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Inheritance and nasty sockets logic

18

try { C150DgmSocket *sock = new C150NastyDgmSocket(nastiness); c150debug->printf(C150APPLICATION,"Ready to accept messages"); while(1) {

readlen = sock -> read(incomingMessage, sizeof(incomingMessage)-1); // … WORK WITH MESSAGE HERE

string response = “SOME RESPONSE HERE”; sock -> write(response.c_str(), response.length()+1);}

} catch (C150NetworkException e) { c150debug->printf(C150ALWAYSLOG,"Caught C150NetworkException: %s\n",

e.formattedExplanation().c_str());}

The C150NastyDgmSocket class inherits from…

… C150DgmSocket. You can use either type here, unless you want to call methods specific to the “nasty”

class.

Page 19: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn19

C++ Exceptions

Page 20: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

C++ Exceptions

20

try {

C150DgmSocket *sock = new C150DgmSocket();sock -> setServerName(argv[serverArg]);

sock -> write(argv[msgArg], strlen(argv[msgArg])+1);readlen = sock -> read(incomingMessage, sizeof(incomingMessage));

checkAndPrintMessage(readlen, incomingMessage, sizeof(incomingMessage)); } catch (C150NetworkException e) { cerr << argv[0] << ": caught C150NetworkException: " << e.formattedExplanation()

<< endl; }

C++ has try/catch/throw for

Exceptionstry clause runs first

Any network exception in try block or

methods called by try block takes us here

e is of whatevertype was “thrown”

Page 21: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

C++ Exceptions Exceptions are particularly useful for network code… …no need to “percolate” return codes through layers of method calls Standard COMP 150IDS Exception Class:

throw throw C150NetworkException("Client received message that was not null terminated");

When an error occurs, throw an Exception (same as “raise” in other langs):

throw C150NetworkException (or other class) Exception classes form a hierarchy…based on class inheritance (no need

for you to worry about that if you don’t know C++ inheritance)

21

Page 22: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn22

MakefilesDependency –based Command Execution

Page 23: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Makefile variables

23

# Do all C++ compies with g++CPP = g++CPPFLAGS = -g -Wall -Werror -I$(C150LIB)

# Where the COMP 150 shared utilities live, including c150ids.a and userports.csv# Note that environment variable COMP150IDS must be set for this to work!

C150LIB = $(COMP150IDS)/files/c150Utils/

[… several lines skipped…]pingclient: pingclient.o $(C150AR) $(INCLUDES)

$(CPP) -o pingclient pingclient.o

Variables defined this way…

…used this way

…or from environment…(this is one reason you

setenv COMP150IDS /comp/150IDS)

Page 24: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Targets and dependencies

24

# Do all C++ compies with g++CPP = g++CPPFLAGS = -g -Wall -Werror -I$(C150LIB)

# Where the COMP 150 shared utilities live, including c150ids.a and userports.csv# Note that environment variable COMP150IDS must be set for this to work!

C150LIB = $(COMP150IDS)/files/c150Utils/

[… several lines skipped…]pingclient: pingclient.o $(C150AR) $(INCLUDES)

$(CPP) -o pingclient pingclient.o

The pingclient target

…depends onpingclient.o (and include files, etc.)

Page 25: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

What gets run

25

# Do all C++ compies with g++CPP = g++CPPFLAGS = -g -Wall -Werror -I$(C150LIB)

# Where the COMP 150 shared utilities live, including c150ids.a and userports.csv# Note that environment variable COMP150IDS must be set for this to work!

C150LIB = $(COMP150IDS)/files/c150Utils/

[… several lines skipped…]pingclient: pingclient.o $(C150AR) $(INCLUDES)

$(CPP) -o pingclient pingclient.o

When pingclient is older than pingclient.o,

etc. …

..use g++ to relink it

Page 26: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Fancier dependencies

26

%.o:%.cpp $(INCLUDES)$(CPP) -c $(CPPFLAGS) $<

Each xxx.o file …depends on xxx.cpp

…and is compiled from that .cpp file

Page 27: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn27

C cs. C++ Strings

Page 28: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

C vs C++ Strings – we use both!

C++ provides automatic allocation and useful concatenation operations

C char[] arrays needed for formatting message packets

File and socket APIs defined in terms of C byte arrays

Also…preference– For some purposes, printf/scanf are handier than C++ <<– Etc.

28

Page 29: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Some hints on strings

Won’t try a full tutorial here but, remember that you can convert:

char cstring[4] = “abc”; // remember the null! string newstring(cstring); // initialize C++ string

// from C string

char *fromCPlusPlus = newstring.c_str(); // IMPORTANT: fromCPlusPlus

// is stable ONLY until // next change to newstring

Our focus is on the distributed system design…performance matters some, but do what’s easy and clean

29

Page 30: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

Stringstreams: useful for formatting and conversions

C++ strings do not support <<, but stringstreams do

include <sstream> // for stringstream include <iostream> // for cout

stringstream ss; // empty stringstream int answer = 25;

ss << “The answer is “<< answer << “ pounds” << endl; cout << ss.str(); // get string from stringstream

30

Page 31: COMP 150-IDS Ping Demonstration Programs & Makefile / C++ Hints

© 2010 Noah Mendelsohn

What I Do (mostly)

I mostly use C++ strings: automatic allocation I use or convert to char[] if I’m using APIs that need them I use either printf or stringstreams for formatting or… …concatenate strings with “+” (slower, and edge cases where it doesn’t

work) Not all the framework code makes good choices internally…you’ll find

some stuff that probably should be cleaned up (e.g. excess conversions)

31


Recommended