Presentation is loading. Please wait.

Presentation is loading. Please wait.

2: Application Layer1 Socket programming Socket API r introduced in BSD4.1 UNIX, 1981 r explicitly created, used, released by apps r client/server paradigm.

Similar presentations


Presentation on theme: "2: Application Layer1 Socket programming Socket API r introduced in BSD4.1 UNIX, 1981 r explicitly created, used, released by apps r client/server paradigm."— Presentation transcript:

1 2: Application Layer1 Socket programming Socket API r introduced in BSD4.1 UNIX, 1981 r explicitly created, used, released by apps r client/server paradigm r two types of transport service via socket API: m unreliable datagram m reliable, byte stream-oriented a host-local, application-created, OS-controlled interface (a “door”) into which application process can both send and receive messages to/from another application process socket Goal: learn how to build client/server application that communicate using sockets

2 2: Application Layer2 Socket-programming using TCP Socket: a door between application process and end-end- transport protocol (UCP or TCP) TCP service: reliable transfer of bytes from one process to another process TCP with buffers, variables socket controlled by application developer controlled by operating system host or server process TCP with buffers, variables socket controlled by application developer controlled by operating system host or server internet

3 2: Application Layer3 Socket programming with TCP Client must contact server r server process must first be running r server must have created socket (door) that welcomes client’s contact Client contacts server by: r creating client-local TCP socket r specifying IP address, port number of server process r When client creates socket: client TCP establishes connection to server TCP r When contacted by client, server TCP creates new socket for server process to communicate with client m allows server to talk with multiple clients m source port numbers used to distinguish clients (more in Chap 3) TCP provides reliable, in-order transfer of bytes (“pipe”) between client and server application viewpoint

4 2: Application Layer4 Stream jargon r A stream is a sequence of characters that flow into or out of a process. r An input stream is attached to some input source for the process, eg, keyboard or socket. r An output stream is attached to an output source, eg, monitor or socket.

5 2: Application Layer5 Socket programming with TCP Example client-server app: 1) client reads line from standard input ( inFromUser stream), sends to server via socket ( outToServer stream) 2) server reads line from socket 3) server converts line to uppercase, sends back to client 4) client reads, prints modified line from socket ( inFromServer stream) Client process client TCP socket

6 2: Application Layer6 Client/server socket interaction: TCP wait for incoming connection request connectionSocket = welcomeSocket.accept() create socket, port= x, for incoming request: welcomeSocket = ServerSocket() create socket, connect to hostid, port= x clientSocket = Socket() close connectionSocket read reply from clientSocket close clientSocket Server (running on hostid ) Client send request using clientSocket read request from connectionSocket write reply to connectionSocket TCP connection setup

7 2: Application Layer7 Example: Java client (TCP) import java.io.*; import java.net.*; class TCPClient { public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("hostname", 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); Create input stream Create client socket, connect to server Create output stream attached to socket

8 2: Application Layer8 Example: Java client (TCP), cont. BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '\n'); modifiedSentence = inFromServer.readLine(); System.out.println ("FROM SERVER: " + modifiedSentence ); clientSocket.close(); } Create input stream attached to socket Send line to server Read line from server

9 2: Application Layer9 Example: Java server (TCP) import java.io.*; import java.net.*; class TCPServer { public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); Create welcoming socket at port 6789 Wait, on welcoming socket for contact by client Create input stream, attached to socket

10 2: Application Layer10 Example: Java server (TCP), cont DataOutputStream outToClient = new DataOutputStream (connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\n'; outToClient.writeBytes(capitalizedSentence); } Read in line from socket Create output stream, attached to socket Write out line to socket End of while loop, loop back and wait for another client connection

11 2: Application Layer11 Socket programming with UDP UDP: no “connection” between client and server r no handshaking r sender explicitly attaches IP address and port of destination to each packet r server must extract IP address, port of sender from received packet UDP: transmitted data may be received out of order, or lost application viewpoint UDP provides unreliable transfer of groups of bytes (“datagrams”) between client and server

12 2: Application Layer12 Client/server socket interaction: UDP close clientSocket Server (running on hostid ) read reply from clientSocket create socket, clientSocket = DatagramSocket() Client Create, address ( hostid, port=x, send datagram request using clientSocket create socket, port= x, for incoming request: serverSocket = DatagramSocket() read request from serverSocket write reply to serverSocket specifying client host address, port number

13 2: Application Layer13 Example: Java client (UDP) Output: sends packet (TCP sent “byte stream”) Input: receives packet (TCP received “byte stream”) Client process client UDP socket

14 2: Application Layer14 Example: Java client (UDP) import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine(); sendData = sentence.getBytes(); Create input stream Create client socket Translate hostname to IP address using DNS

15 2: Application Layer15 Example: Java client (UDP), cont. DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } Create datagram with data-to-send, length, IP addr, port Send datagram to server Read datagram from server

16 2: Application Layer16 Example: Java server (UDP) import java.io.*; import java.net.*; class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); Create datagram socket at port 9876 Create space for received datagram Receive datagram

17 2: Application Layer17 Example: Java server (UDP), cont String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } Get IP addr port #, of sender Write out datagram to socket End of while loop, loop back and wait for another datagram Create datagram to send to client

18 2: Application Layer18 UDP Sockets r int socket(int domain, int type, int protocol); r int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); r ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); r ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sock-addr *from, socklen_t *fromlen);

19 2: Application Layer19 UDP Sockets r int socket(int domain, int type, int protocol); r socket() creates an endpoint for communication and returns a descriptor. Domain: PF_INET IPv4 Internet protocols ip(7) PF_INET6 IPv6 Internet protocols Type: SOCK_STREAM: TCP Sockets SOCK_DGRAM: UDP Sockets Protocol: The protocol specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family, in which a case protocol can be specified as 0.

20 2: Application Layer20 UDP Sockets r int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); r Bind() gives the socket sockfd the local address my_addr. my_addr is addrlen bytes long. Setting up the socket addr structure: struct cliAddr; cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(0);

21 2: Application Layer21 UDP Sockets r ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); r s = Socket descriptor r buf = Message to send r len = Length of message r flags = Normally 0, specifies the behavior of the socket r to = Pointer to the sockaddr structure that contains the destination (IP and port) remoteAddr.sin_port remoteAddr.sin_addr.s_addr r tolen = Length of remoteAddr socket

22 2: Application Layer22 UDP Sockets r ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sock-addr *from, socklen_t *fromlen); r s = Socket descriptor r buf = Pointer of buffer of which will be filled by the message. r len = The length of the buffer r flags = Normally 0, specifies the behavior of the socket r from = Pointer to the sockaddr structure that contains the destination (IP and port) remoteAddr.sin_port remoteAddr.sin_addr.s_addr r fromlen = Length of sockaddr struct

23 2: Application Layer23 UDP Client Example #include #include /* memset() */ #include /* select() */ #include #define REMOTE_SERVER_PORT 1500 //bind to port 1500 #define MAX_MSG 100 int main(int argc, char *argv[]) { int sd, rc, i; struct sockaddr_in cliAddr, remoteServAddr; struct hostent *h;

24 2: Application Layer24 /* get server IP address (no check if input is IP address or DNS name */ h = gethostbyname(argv[1]); if(h==NULL) { printf("%s: unknown host '%s' \n", argv[0], argv[1]); exit(1); } printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name, inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); remoteServAddr.sin_family = h->h_addrtype; memcpy((char *) &remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT); /* socket creation */ sd = socket(AF_INET,SOCK_DGRAM,0); if(sd<0) { printf("%s: cannot open socket \n",argv[0]); exit(1); } /* bind any port */ cliAddr.sin_family = AF_INET; /* pick any available network interface */ cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* bind to any local port */ cliAddr.sin_port = htons(0);

25 2: Application Layer25 rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); if(rc<0) { printf("%s: cannot bind port\n", argv[0]); exit(1); } char* line; int sent; /* send data */ while(1){ /* Prompt user for string and send to the server */ line = readline("Enter text: "); sent = sendto(sd, line, strlen(line)+1, 0, (struct sockaddr *) &remoteServAddr, sizeof(remoteServAddr)); if(sent<0) { printf("%s: cannot send data\n",line); close(sd); exit(1); }

26 2: Application Layer26 char msg[MAX_MSG]; /* receive response from server */ int remoteServSize = sizeof(remoteServAddr); rc = recvfrom(sd,msg,MAX_MSG, 0, (struct sockaddr*) &remoteServAddr, &remoteServSize); if(rc<0){ printf("Error occurred receiving from server\n"); exit(1); } printf("%s\n", msg); } return 1; }

27 2: Application Layer27 UDP Server Example #include #include /* close() */ #include /* memset() */ #include #define LOCAL_SERVER_PORT 1500 /* Listen on port 1500 */ #define MAX_MSG 100 #define MAX_RESPONSE 1024 int main(int argc, char *argv[]) { int sd, rc, n, cliLen; struct sockaddr_in cliAddr, servAddr; char msg[MAX_MSG]; /* socket creation */ sd=socket(AF_INET, SOCK_DGRAM, 0); if(sd<0) { printf("%s: cannot open socket \n",argv[0]); exit(1); }

28 2: Application Layer28 /* bind local server port */ servAddr.sin_family = AF_INET; /* Accept a connection from interface */ servAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Listen on Port 1500 */ servAddr.sin_port = htons(LOCAL_SERVER_PORT); rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); if(rc<0) { printf("%s: cannot bind port number %d \n", argv[0], LOCAL_SERVER_PORT); exit(1); } printf("%s: waiting for data on port UDP %u\n", argv[0],LOCAL_SERVER_PORT); /* server infinite loop */ while(1) { /* init buffer */ memset(msg,0x0,MAX_MSG); /* receive message */ cliLen = sizeof(cliAddr); n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen);

29 2: Application Layer29 if(n<0) { printf("%s: cannot receive data \n",argv[0]); continue; } /* print received message */ printf("%s: from %s:UDP%u : %s \n", argv[0],inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port),msg); char response[MAX_RESPONSE]; char* responseMsg = "Received your message: "; int len = strlen(responseMsg) + 1; strcpy(response,responseMsg); strncat(response,msg,MAX_RESPONSE-len); n = sendto(sd, response, strlen(response)+1,0,(struct sockaddr*) &cliAddr, sizeof(cliAddr)); if(n<0){ printf("Error sending to client\n"); exit(1); } }/* end of server infinite loop */ return 0; }

30 2: Application Layer30 GDB Basics r How to setup the environment to dump core files: m csil% ulimit –c unlimited r How to open a core file m csil% gdb –q./executable corename (the parameter –q is optional. The will prevent GDB from printing out extra garbage when it initially loads) r What to do when a core file is loaded up m (gdb) bt (backtrace) Will show you the stack when the program crashed r More useful to run your program with GDB. m csil% gdb –q./executable Set breakpoints: (gdb) b OR b Run the program: (gdb) r –The program will break when it reaches a breakpoint –Print value of a variable: (gdb) print –Step through a function: (gdb) s –Skip to the next instruction: (gdb) n –Continue until the program exits or another breakpoint is reached: (gdb) c


Download ppt "2: Application Layer1 Socket programming Socket API r introduced in BSD4.1 UNIX, 1981 r explicitly created, used, released by apps r client/server paradigm."

Similar presentations


Ads by Google