ee324 programming tutorial

29
Introduction to Socket Programming Jeong, EunYoung (notav at ndsl.kaist.edu) EE324 Programming Tutorial 1

Upload: lida

Post on 23-Feb-2016

49 views

Category:

Documents


0 download

DESCRIPTION

Introduction to Socket Programming Jeong, EunYoung ( notav at ndsl.kaist.edu). EE324 Programming Tutorial. Outline. Socket programming Editor ( emacs ) Compiling ( Makefile ) Debugging ( gdb ). Sockets. Sockets Abstraction for data communication - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: EE324 Programming Tutorial

1

Introduction to Socket ProgrammingJeong, EunYoung (notav at ndsl.kaist.edu)

EE324 Programming Tu-torial

Page 2: EE324 Programming Tutorial

2

Socket programming Editor (emacs) Compiling (Makefile) Debugging (gdb)

Outline

Page 3: EE324 Programming Tutorial

3

Sockets Abstraction for data communication A process can send/receive data

through sockets

Sockets

Page 4: EE324 Programming Tutorial

4

TCP socket API Stream sockets Connection-oriented 4 tuples (source IP, port, destination IP, port) Reliable

UDP socket API Datagram sockets 2 tuples (source IP, port) Unreliable

Socket API

Page 5: EE324 Programming Tutorial

5

TCP socket programming Server first listens for incoming connections Client initiates the connection to the server Server accepts the connection Exchange data

Server sends “Hello, world!” to the client Close connection

Reference: Beej’s guide to network program-ming http://

beej.us/guide/bgnet/output/html/multipage/clientserver.html

TCP Socket Programming

Page 6: EE324 Programming Tutorial

6

/* create a socket */sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sockfd < 0) { perror("socket"); return -1;}

/* set the address family (IPv4), address (any address), port */saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = INADDR_ANY;saddr.sin_port = htons(PORT);/* bind the address to the socket */if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in))) {perror("bind");close(sockfd);return -1;}

TCP Server Example

Page 7: EE324 Programming Tutorial

7

/* listen connections */if (listen(sockfd, BACKLOG) < 0) {perror("listen");exit(1);}

/* reap all dead processes */sa.sa_handler = sigchld_handler;sigemptyset(&sa.sa_mask);sa.sa_flags = SA_RESTART;if (sigaction(SIGCHLD, &sa, NULL) == -1) {perror("sigaction");exit(1);}

printf("server: waiting for connections...\n");

TCP Server Example

Page 8: EE324 Programming Tutorial

8

while (1) { // main accept() loop /* accept new connections from clients */ sin_size = sizeof(their_addr); new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); if (new_fd == -1) { perror("accept"); continue; }

inet_ntop(AF_INET, &their_addr.sin_addr, s, sizeof(s)); printf("server: got connection from %s\n", s);

if (!fork()) { // this is the child process close(sockfd); // child doesn't need the listener if (send(new_fd, "Hello, world!", 13, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); // parent doesn't need this}

TCP Server Example

Page 9: EE324 Programming Tutorial

9

/* get the server host entry */hp = gethostbyname(argv[1]);if (hp == NULL) {perror("gethostbyname");return -1;}

/* create stream socket */sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sockfd < 0) {perror("socket");return -1;}

/* set the destination address */daddr.sin_family = AF_INET;memcpy(&daddr.sin_addr.s_addr, hp->h_addr, hp->h_length);daddr.sin_port = htons(PORT);

TCP Client Example

Page 10: EE324 Programming Tutorial

10

/* connect to the destination */if (connect(sockfd, (struct sockaddr *)&daddr, sizeof(struct sockaddr_in))) { close(sockfd); perror("connect"); return -1;}inet_ntop(AF_INET, &daddr.sin_addr, s, sizeof(s));printf("client: connecting to %s\n", s);

/* receive message sent from the server */if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { perror("recv"); exit(1);}/* print the received message */buf[numbytes] = '\0';printf("client: received '%s'\n", buf);close(sockfd);

TCP Client Example

Page 11: EE324 Programming Tutorial

11

UDP socket programming No connection establishment! Server binds to a port (bind()) Exchange data

Server waits for incoming messages (recvfrom())

Client sends messages (sendto()) Simple!

But there can be loss of data

UDP Socket Programming

Page 12: EE324 Programming Tutorial

12

/* create a socket */sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockfd < 0) {perror("socket");return -1;}

/* set the address family (IPv4), address (any address), port */saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = INADDR_ANY;saddr.sin_port = htons(PORT);

/* bind the address to the socket */if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in))) {perror("bind");close(sockfd);return -1;}

UDP Listener Example

Page 13: EE324 Programming Tutorial

13

printf("listener: waiting to recvfrom...\n");

addr_len = sizeof their_addr;if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN - 1 , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) {perror("recvfrom");exit(1);}

printf("listener: got packet from %s\n",inet_ntop(AF_INET, &their_addr.sin_addr, s, sizeof(s)));printf("listener: packet is %d bytes long\n", numbytes);buf[numbytes] = '\0';printf("listener: packet contains \"%s\"\n", buf);

close(sockfd);

UDP Listener Example

Page 14: EE324 Programming Tutorial

14

/* get the server host entry */hp = gethostbyname(argv[1]);if (hp == NULL) {perror("gethostbyname");return -1;}

/* create a socket */sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockfd < 0) {perror("socket");return -1;}

UDP Talker Example

Page 15: EE324 Programming Tutorial

15

/* set the destination address */daddr.sin_family = AF_INET;memcpy(&daddr.sin_addr.s_addr, hp->h_addr, hp->h_length);daddr.sin_port = htons(PORT);

if ((numbytes = sendto(sockfd, argv[2], strlen(argv[2]), 0, (struct sockaddr *)&daddr, sizeof(struct sockaddr))) == -1) {perror("talker: sendto");exit(1);}

printf("talker: sent %d bytes to %s\n", numbytes, argv[1]);close(sockfd);

UDP Talker Example

Page 16: EE324 Programming Tutorial

16

Launching emacs $ emacs server.c

Notations C-x: Ctrl + x, M-x: ESC followed by x (or Alt + x)

Moving around in buffers Forward: →, C-f Backward: ←, C-b Next line: ↓, C-n Previous line: ↑, C-p Searching

C-s: forward search, C-r: backward search Jumping

M-g g: go to the line

Emacs

Page 17: EE324 Programming Tutorial

17

Region Marking: C-SPC C-x h: Select all M-h: Select paragraph

Killing C-k: kill line, C-u 10 C-k: kill 10 lines

Yanking (Paste) C-y: Yanks last killed text

Undo C-/, C-_, C-x u

Emacs

Page 18: EE324 Programming Tutorial

18

Finally exit! C-x C-c

For more detail http://www.gnu.org/software/emacs/tour/ http://cmgm.stanford.edu/classes/unix/emacs.

html

Emacs

Page 19: EE324 Programming Tutorial

19

Simple compiling g++ (source codes) –o (object name) Ex) $ g++ server.c –o server Ex) $ g++ a.c b.c d.c –o abd

Compile options -g: for debugging -Wall: show as many warnings as possible -DNDEBUG: remove asserts when compiling Ex) $ g++ -g –Wall server.c –o server

Compiling

Page 20: EE324 Programming Tutorial

20

Script for easier compilation g++ main.cpp hello.cpp factorial.cpp -o hello -

> make Basic Makefile

Target: dependencies [tab] system command

Exampleall:

g++ main.cpp hello.cpp factorial.cpp -o hello

Makefile

Reference: http://mrbook.org/tutorials/make/

Page 21: EE324 Programming Tutorial

21

Build process Compiler generates object files from source codes Linker creates executable binary from the object files

Exampleall: hellohello: main.o factorial.o hello.og++ main.o factorial.o hello.omain.o: main.cppg++ -c main.cpp…clean:rm -rf *.o hello

Using Dependencies

Page 22: EE324 Programming Tutorial

22

ExampleCC=g++CFLAGS=-g –Wall

all: hellohello: main.o factorial.o hello.o$(CC) main.o factorial.o hello.omain.o: main.cpp $(CC) $(CFLAGS) -c main.cpp…clean:rm -rf *.o hello

Using Variables

Page 23: EE324 Programming Tutorial

23

CC=g++CFLAGS=-g –WallLDFLAGS=SOURCES=main.cpp hello.cpp factorial.cppOBJECTS=$(SOURCES:.cpp=.o)EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)$(EXECUTABLE): $(OBJECTS) –o $@

$(CC) $(LDFLAGS) $(OBJECTS) –o [email protected]:

$(CC) $(CFLAGS) –c $< -o $@clean:

rm -rf *.o $(EXECUTABLE)

Complete Example

Page 24: EE324 Programming Tutorial

24

Debugger Helps pointing problem of your program

gdb

Reference: http://www.cs.cmu.edu/~gilpin/tutorial/

Page 25: EE324 Programming Tutorial

25

Running program gdb main (gdb) run

Exiting (gdb) quit

Running with gdb

Page 26: EE324 Programming Tutorial

26

Exploring stack frames backtrace (or bt): print backtrace of all stack

frames up: go to the stack frame called by this one down: go to the stack frame called this one help stack for more features

print: print value of expression Ex) print item_to_remove

x: examine memory Ex) x 0xffbef014

Inspecting Crashes

Page 27: EE324 Programming Tutorial

27

Breakpoints Make the program break at a certain point break LinkedList<int>::remove Or break main.cc:53

Giving condition Make the breakpoint only works on a certain

condition condition 1 item_to_remove==1

Stepping step: forward a line

Conditional Breakpoints

Page 28: EE324 Programming Tutorial

28

Line 77: marker is set to 0 Line 79: marker is accessed Removing line 77 will make it work

For more information http://www.cs.cmu.edu/~gilpin/tutorial/ http://www.unknownroad.com/rtfm/gdbtut/ http://www.cs.umd.edu/~srhuang/teachin

g/cmsc212/gdb-tutorial-handout.pdf

Finding the Bug

Page 29: EE324 Programming Tutorial

29

Question?