Socket Programming - ICT Department, USTH - PDF

Summary

These lecture notes cover socket programming, including what sockets are, why they are used, and the different types of sockets (stream and datagram). It also discusses layering in network communication and provides an overview of setting up sockets for both servers and clients.

Full Transcript

What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket Programming Tran Giang Son, [email protected] ICT Department, USTH Socket Programming Tran Giang S...

What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket Programming Tran Giang Son, [email protected] ICT Department, USTH Socket Programming Tran Giang Son, [email protected] 1 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Contents What’s a socket? Why socket? What’s in a socket? How to use sockets? Socket Programming Tran Giang Son, [email protected] 2 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect What & Why? Socket Programming Tran Giang Son, [email protected] 3 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Layers 7 Application Application 6 Presentation Presentation 5 Session Session 4 Transport Transport 3 Network Network Network 2 Data link Data link Data link 1 Physical Physical Physical Socket Programming Tran Giang Son, [email protected] 4 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Why layering? Similar to application layering Application programmer Doesn’t care about routing Doesn’t care about Ethernet frame Doesn’t care about WiFi WPA2 encryption Doesn’t care about reliability implementations Socket Programming Tran Giang Son, [email protected] 5 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Why layering? Application programmer Passes the data down Focus on the application Socket Programming Tran Giang Son, [email protected] 6 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Why layering? Lower layers: What does they need to know? Socket Programming Tran Giang Son, [email protected] 7 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Why layering? Lower layers: What does they need to know? Destination Where to? Hostname («resolved» with gethostbyname()) IP address Which service? Indicated by port number Socket Programming Tran Giang Son, [email protected] 7 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: What? Endpoint of a two-way communication link between two networked programs Represented by a file descriptor after creation Unix philosophy: Everything is a file De facto standard for TCP/UDP, replaced NetBIOS / NetBEUI IPX / SPX Socket Programming Tran Giang Son, [email protected] 8 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Applications Most network applications use sockets Send messages Share data: image, music, video, “cast’ ’ Interprocess Communication (IPC) Socket Programming Tran Giang Son, [email protected] 9 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Which types? Stream sockets: connection-oriented with TCP Make a connection Transfer data Close connection Ensure sequence, error checking, etc... Example: youtube video Socket Programming Tran Giang Son, [email protected] 10 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Which types? Stream sockets: connection-oriented with TCP Make a connection Transfer data Close connection Ensure sequence, error checking, etc... Example: youtube video Datagram sockets: connectionless with UDP Transfer data without explicitly making a connection Example: DNS Socket Programming Tran Giang Son, [email protected] 10 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Why? The standard API for connecting processes Local Networked Socket Programming Tran Giang Son, [email protected] 11 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Why? The standard API for connecting processes Local Networked Compatibility: widely supported Linux / UNIX Windows macOS Socket Programming Tran Giang Son, [email protected] 11 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Why? The standard API for connecting processes Local Networked Compatibility: widely supported Linux / UNIX Windows macOS Low level Minimize amount of data transfer Fast, very little overhead Customizable, flexible, self-defined protocol Socket Programming Tran Giang Son, [email protected] 11 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Why NOT socket over higher level libraries? Low level: more efforts Define protocol Message boundaries Data representation Security Session control Authentication, etc. Socket Programming Tran Giang Son, [email protected] 12 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect What’s in a socket? Server socket address 208.216.181.15:80 Client socket address 128.2.194.242:3479 FTP Server (port 21) Client HTTP Server Connection socket pair (port 80) (128.2.194.242:3479, 208.216.181.15:80) Client host address Server host address 128.2.194.242 208.216.181.15 Socket Programming Tran Giang Son, [email protected] 13 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Overview & Setup Socket Programming Tran Giang Son, [email protected] 14 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Overview Server Client Passively waits Initiates the connection Passive socket Active socket Socket Programming Tran Giang Son, [email protected] 15 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Overview Steps Setup Where is the remote host? What service? Transfer Data Send/Receive ~ write() / read() Close Socket Programming Tran Giang Son, [email protected] 16 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket Overview Client Server socket socket bind open_listenfd open_clientfd listen Connection connect request accept write read Client / Server Session read write EOF close read close Socket Programming Tran Giang Son, [email protected] 17 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Overview socket() Buy bind() Connect cable listen() Power on accept() Accept Server socket Landline phone Socket Programming Tran Giang Son, [email protected] 18 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Socket: Important struct struct sockaddr_in { short sin_family; // e.g. AF_INET unsigned short sin_port; // e.g. htons(3490) struct in_addr sin_addr; // see struct in_addr, below char sin_zero; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_aton() }; Socket Programming Tran Giang Son, [email protected] 19 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Setup socket() int socket(int domain, int type, int protocol); domain: AF_INET (IPv4) or AF_INET6 (IPv6) type: SOCK_STREAM (TCP) or SOCK_DGRAM (UDP) protocol: 0 For example: int sockfd = socket(AF_INET, SOCK_STREAM, 0); Socket Programming Tran Giang Son, [email protected] 20 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Binding bind() int bind(int sockfd, const struct sockaddr *bind_addr, socklen_t addrlen); sockfd: file descriptor that socket() returned bind_addr: a «struct sockaddr_in» for IPv4 addrlen: size of the struct pointed by bind_addr Socket Programming Tran Giang Son, [email protected] 21 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Example for socket() and bind() struct sockaddr_in saddr; int sockfd; unsigned short port = 80; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(“Error creating socket\n”);... } memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(port); if (bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { printf(“Error binding\n”);... } Socket Programming Tran Giang Son, [email protected] 22 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Listen to incoming connections listen() int listen(int sockfd, int backlog); sockfd: file descriptor that socket() returned backlog: number of pending connections to queue For example: listen(sockfd, 10); Socket Programming Tran Giang Son, [email protected] 23 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Accept an incoming connection accept() Server must explicitly accept incoming connections int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) sockfd: file descriptor that socket() returned addr: pointer to store client address addrlen: size of addr Returns a file descriptor for the connected socket For example: int client = accept(sockfd, (struct sockaddr_in *) &caddr, &clen); Socket Programming Tran Giang Son, [email protected] 24 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Example for listen() and accept() if (listen(sockfd, 5) < 0) { printf(“Error listening\n”);... } clen=sizeof(caddr); if ((clientfd=accept(sockfd, (struct sockaddr *) &caddr, &clen)) < 0) { printf(“Error accepting connection\n”);... } Socket Programming Tran Giang Son, [email protected] 25 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Server: Complete Example int sockfd, clen, clientfd; struct sockaddr_in saddr, caddr; unsigned short port = 80; if ((sockfd=socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(“Error creating socket\n”);... } memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(port); if ((bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { printf(“Error binding\n”);... } if (listen(sockfd, 5) < 0) { printf(“Error listening\n”);... } clen=sizeof(caddr); if ((clientfd=accept(sockfd, (struct sockaddr *) &caddr, &clen)) < 0) { printf(“Error accepting connection\n”);... } Socket Programming Tran Giang Son, [email protected] 26 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Practical Work 3: Server setup Write a new program in C Name it « 03.practical.work.server.setup.c » Write a server that: listens to TCP port 8784 [USTH in a T9 dial pad!] binds to all possible interfaces prints a message when a client connects to it Deploy to your shiny VPS Test the connection Use «telnet» or «nc» Push your C program to corresponding forked Github repository Socket Programming Tran Giang Son, [email protected] 27 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Remind: Socket Overview Client Server socket socket bind open_listenfd open_clientfd listen Connection connect request accept write read Client / Server Session read write EOF close read close Socket Programming Tran Giang Son, [email protected] 28 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Client: Setup socket() Similar to server’s int socket(int domain, int type, int protocol); domain: AF_INET (IPv4) or AF_INET6 (IPv6) type: SOCK_STREAM (TCP) or SOCK_DGRAM (UDP) protocol: 0 For example: int sockfd = socket(AF_INET, SOCK_STREAM, 0); Socket Programming Tran Giang Son, [email protected] 29 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Client: Connect to server connect() int connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen); sockfd: file descriptor that socket() returned addr: pointer to store server address addrlen: size of addr Example: connect(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)); Socket Programming Tran Giang Son, [email protected] 30 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Client: Complete Example struct sockaddr_in saddr; struct hostent *h; int sockfd; unsigned short port = 80; if ((sockfd=socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(“Error creating socket\n”);... } if ((h=gethostbyname(“ict.usth.edu.vn”)) == NULL) { printf(“Unknown host\n”);... } memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; memcpy((char *) &saddr.sin_addr.s_addr, h->h_addr_list, h->h_length); saddr.sin_port = htons(port); if (connect(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { printf(“Cannot connect\n”);... } Socket Programming Tran Giang Son, [email protected] 31 / 61 What & Why? Overview & Setup Data Transfer Message Framing Disconnect Practical Work 4: Client setup Write a new program in C Name it « 04.practical.work.client.setup.c » Write a client that: gets server hostname from program arguments in case no argument, asks hostname from STDIN resolves its IP address, print to STDOUT connects to that server, TCP port 8784 [It’s USTH] prints a message if it connects to server successfully Test the connection from your client to your server on VPS Push your C program to corresponding forked Github repository Socket Programming Tran Giang Son, [email protected] 32 / 61