Daniel Spangenberger 15-441 Computer Networks, Fall 2007.

Slides:



Advertisements
Similar presentations
Socket Programming Computer Networks, Spring 2008 Your TAs.
Advertisements

Introduction to Sockets Jan Why do we need sockets? Provides an abstraction for interprocess communication.
Sockets: Network IPC Internet Socket UNIX Domain Socket.
Sop, Fan Reference: Daniel Spangenberger Computer Networks PPT-4 Socket Programming.
Today’s topic: Basic TCP API –Socket –Bind –Listen –Connect –Accept –Read –Write –Close.
Sockets Programming CS144 Review Session 1 April 4, 2008 Ben Nham.
Socket Programming Computer Networks, Spring 2008 Xi Liu.
Networks: TCP/IP Socket Calls1 Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
Quick Overview. 2 ISO/OSI Reference Model Application Application Presentation Presentation Session Session Transport Transport Network Network Data Link.
Network Programming UNIX Internet Socket API. Everything in Unix is a File –When Unix programs do any sort of I/O, they do it by reading or writing to.
1 Socket Interfaces Professor Jinhua Guo CIS527 Fall 2003.
Tutorial 8 Socket Programming
Programming with Berkeley Sockets Presented by Chris GauthierDickey Written by Daniel Stutzbach (I think!) for CIS 432/532 Useful References: ● man pages.
Introduction to Socket Programming April What is a socket? An interface between application and network –The application creates a socket –The socket.
Introduction to Project 1 Web Client and Server Jan 2006.
Computer Networks Sockets. Outline F Socket basics F Socket details.
CS 360 – Spring 2007 Pacific University TCP section 6.5 (Read this section!) 27 Feb 2007.
1 Tutorial on Socket Programming Computer Networks - CSC 458 Department of Computer Science Yukun Zhu (Slides are mainly from Monia Ghobadi, and Amin Tootoonchian,
Basic Socket Programming TCP/IP overview. TCP interface Reference: –UNIX Network Programming, by Richard Stevens. –UNIX man page.
TCP Socket Programming. r An abstract interface provided to the application programmer  File descriptor, allows apps to read/write to the network r Allows.
ECE 4110 – Internetwork Programming Client-Server Model.
Sockets and intro to IO multiplexing. Goals We are going to study sockets programming as means to introduce IO multiplexing problem. We will revisit socket.
Operating Systems Chapter 9 Distributed Communication.
Zhu Reference: Daniel Spangenberger Computer Networks, Fall 2007 PPT-4 Socket Programming.
CS345 Operating Systems Φροντιστήριο Άσκησης 2. Inter-process communication Exchange data among processes Methods –Signal –Pipe –Sockets.
Sirak Kaewjamnong Computer Network Systems
Server Sockets: A server socket listens on a given port Many different clients may be connecting to that port Ideally, you would like a separate file descriptor.
CS162B: IPv4 Socketing Jacob T. Chan. Socketing in the Real World  Most computer games are multiplayer in nature or have multiplayer components  DotA,
 Wind River Systems, Inc Chapter - 13 Network Programming.
Review: How to create a TCP end point? What is the right format for sin_port and sin_addr in the sockaddr_in data structure? How many different ways we.
Remote Shell CS230 Project #4 Assigned : Due date :
Networking Tutorial Special Interest Group for Software Engineering Luke Rajlich.
UNIX Sockets COS 461 Precept 1. Socket and Process Communication The interface that the OS provides to its networking subsystem application layer transport.
Introduction to Socket
Socket Programming Lab 1 1CS Computer Networks.
CONCURRENT PROGRAMMING Lecture 5. 2 Assignment 1  Having trouble?  Resolve it as early as possible!  Assignment 2:  Handling text-based protocol 
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: HsinYu Ha.
Introduction to Sockets
UNIX Internet Socket API
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: Hsin-Yu Ha.
Read() recv() connection establishment Server (connection-oriented protocol) blocks until connection from client Client socket() bind() listen() accept()
2: Application Layer 1 Socket Programming UNIX Network Programming, Socket Programming Tutorial:
CSCI 330 UNIX and Network Programming Unit XIV: User Datagram Protocol.
回到第一頁 Client/sever model n Client asks (request) – server provides (response) n Typically: single server - multiple clients n The server does not need.
Socket Programming. Computer Science, FSU2 Interprocess Communication Within a single system – Pipes, FIFOs – Message Queues – Semaphores, Shared Memory.
1 Spring Semester 2008, Dept. of Computer Science, Technion Internet Networking recitation #7 Socket Programming.
1 TCP Sockets Programming Creating a passive mode (server) socket.Creating a passive mode (server) socket. Establishing an application-level connection.Establishing.
Lecture 15 Socket Programming CPE 401 / 601 Computer Network Systems slides are modified from Dave Hollinger.
Lecture 3 TCP and UDP Sockets CPE 401 / 601 Computer Network Systems slides are modified from Dave Hollinger.
Sockets Intro to Network Programming. Before the internet... Early computers were entirely isolated No Internet No network No model No external communications.
1 Socket Interface. 2 Basic Sockets API Review Socket Library TCPUDP IP EthernetPPP ARP DHCP, Mail, WWW, TELNET, FTP... Network cardCom Layer 4 / Transport.
Netprog: TCP Sockets1 TCP Sockets Programming Creating a passive mode (server) socket.Creating a passive mode (server) socket. Establishing an application-level.
Socket programming Péter Verhás August 2002
CS 3700 Networks and Distributed Systems
CS 1652 Jack Lange University of Pittsburgh
Socket Programming in C
Review: TCP Client-Server Interaction
Tutorial on Socket Programming
Transport layer API: Socket Programming
CS 3700 Networks and Distributed Systems
תקשורת ומחשוב תרגול 3-5 סוקטים ב-C.
TCP Sockets Programming
Socket Programming.
Sockets Programming Socket to me!.
Computer Networks, Spring 2013
Sockets Programming Socket to me!.
Internet Networking recitation #8
Outline Communications in Distributed Systems Socket Programming
Sockets.
Presentation transcript:

Daniel Spangenberger Computer Networks, Fall 2007

Goal of Networking: Communication  Share data  Pass Messages Say I want to talk to a friend in Singapore…  How can I do this?  What applications and services must I use?  Where can I access them?  How will the data get there?  Will it be reliable?

Motivations for Sockets What’s in a Socket? Working with Sockets Concurrent Network Applications Software Engineering for Project 1

Application Presentation Session Transport Network Data Link Physical Application Presentation Session Transport Network Data Link Physical Network Data Link Physical Core Network End-to-end Transparency Application IP TCP WiFi

Let’s consider project one… Client (mIRC) :6262 Client (mIRC) :6262 Server (IRC) :6667 Server (IRC) :6667 TCP IP Packet #1 IP Packet #2 IP Packet #3 IP Packet #4 Ethernet Frame #1 Ethernet Frame #2 Ethernet Frame #3 Ethernet Frame #4 Which Is also…

An application programmer (writing an IRC server)  Doesn’t need to send IP packets  Doesn’t need to send Ethernet frames  Doesn’t need to worry about reliability  Shouldn’t have to! Sockets do this!  TCP streams  UDP packetized service (Project 2) You’ll be doing this! (using sockets)  To share data  To pass messages

IRC Server (Project 1)  Login  Reverse host lookup  Support for channels  Support for private messages Message Routing (Project 2)  Unicast routing (OSPF)  Multicast routing (MOSPF)  Server extensions for message forwarding

Some information needed…  Where is the remote machine?  IP Address  Hostname (resolved to IP)  Which service do I want?  Port After that…  You get a file! A plain old file!  As simple as other Unix I/O  Don’t forget to close it when you’re done!

Request a socket descriptor  Both the client and the server need to  Bunch of kernel allocations… And the server…  Binds to a port  “I am offering a service on port x. Hear me roar”  Listens to the socket  “Hey! Say something!”  Accepts the incoming connection  “Good, you spoke up!” And the client…  Connects  “I’m interested!”

Server Client socket() connect() write() read() close() socket() bind() listen() accept() write() read() close() read() EOF Connection Request Client / Server Session

Both the client and server need to setup the socket  int socket(int domain, int type, int protocol) Domain  AF_INET (IPv4, also IPv6 available) Type  SOCK_STREAM TCP (your IRC server)  SOCK_DGRAM UDP (your routing daemon) Protocol  0 (trust us, or, read the manpage) int sockfd = socket(AF_INET, SOCK_STREAM, 0);

Server-only (read the man-page!)  int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); sockfd  A file descriptor to bind with, what socket returned! my_addr  It’s a struct (duh), describing an Internet socket/endpoint 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[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_aton() }; 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[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_aton() };

addrlen  sizeof(your sockaddr_in struct) struct sockaddr_in my_addr; int sockfd; unsigned short port = 80; if (0 > (sockfd = socket(AF_INET, SOCK_STREAM, 0))) { printf(“Error creating socket\n”);... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out my_addr.sin_family = AF_INET; // match the socket() call my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address my_addr.sin_port = htons(port); // specify port to listen on if((bind(sockfd, (struct sockaddr *) &my_addr, sizeof(saddr)) < 0) { printf(“Error binding\n”);... } struct sockaddr_in my_addr; int sockfd; unsigned short port = 80; if (0 > (sockfd = socket(AF_INET, SOCK_STREAM, 0))) { printf(“Error creating socket\n”);... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out my_addr.sin_family = AF_INET; // match the socket() call my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address my_addr.sin_port = htons(port); // specify port to listen on if((bind(sockfd, (struct sockaddr *) &my_addr, sizeof(saddr)) < 0) { printf(“Error binding\n”);... }

bind() takes a sockaddr C polymorphism  There’s a different sockaddr for IPv6!  And options for more in the future… struct sockaddr { short int sa_family;// “virtual pointer” char sa_data[14];// address info } struct sockaddr { short int sa_family;// “virtual pointer” char sa_data[14];// address info }

A little lesson on byte ordering…  Network byte ordering is defined to be big-endian  x86, x86-64 are little endian So how do we convert?  htons() / htonl() – Convert host order to network order  ntohs() / ntohl() – Convert network order to host order And what needs to be converted?  Addresses  Ports  Practically anything that deals with a network syscall  Maybe even data (up to the protocol designer)

Allows the server to listen for new connections  int listen(int sockfd, int backlog) sockfd  A file descriptor to listen on, what socket returned! backlog  The number of connections to queue listen(sockfd, 10);

The server must explicitly accept connections  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockfd  A file descriptor to listen on, what socket returned! addr  Pointer to a sockaddr_in, cast as sockaddr* to store the client’s address information in addrlen  Pointer to an int to store the returned size of addr, should be initialized as sizeof(addr) int csock = accept(sockfd, (struct sockaddr_in *) &caddr, &clen);

struct sockaddr_in saddr, caddr; int sockfd, clen, isock; unsigned short port = 80; if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0))) { printf(“Error creating socket\n”);... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address saddr.sin_port = htons(port); // specify port to listen on if (0 > (bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr))) { printf(“Error binding\n”);... } if (0 > listen(sockfd, 5)) { // listen for incoming connections printf(“Error listening\n”);... } clen = sizeof(caddr) if (0 > (isock = accept(sockfd, (struct sockaddr *) &caddr, &clen))) { printf(“Error accepting\n”);... } struct sockaddr_in saddr, caddr; int sockfd, clen, isock; unsigned short port = 80; if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0))) { printf(“Error creating socket\n”);... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address saddr.sin_port = htons(port); // specify port to listen on if (0 > (bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr))) { printf(“Error binding\n”);... } if (0 > listen(sockfd, 5)) { // listen for incoming connections printf(“Error listening\n”);... } clen = sizeof(caddr) if (0 > (isock = accept(sockfd, (struct sockaddr *) &caddr, &clen))) { printf(“Error accepting\n”);... }

Client does not need to bind, listen, or accept Client needs only to socket and connect  int connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen); connect(sockfd, (struct sockaddr *) &saddr, sizeof(saddr));

struct sockaddr_in saddr; struct hostent *h; int sockfd, connfd; unsigned short port = 80; if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0))) { printf(“Error creating socket\n”);... } // looking up the hostname if (NULL == (h=gethostbyname(“ { printf(“Unknown host\n”);... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call memcpy((char *) &saddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); // copy the address saddr.sin_port = htons(port); // specify port to connect to if (!connect(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) { printf(“Cannot connect\n”);... } struct sockaddr_in saddr; struct hostent *h; int sockfd, connfd; unsigned short port = 80; if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0))) { printf(“Error creating socket\n”);... } // looking up the hostname if (NULL == (h=gethostbyname(“ { printf(“Unknown host\n”);... } memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call memcpy((char *) &saddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); // copy the address saddr.sin_port = htons(port); // specify port to connect to if (!connect(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)) { printf(“Cannot connect\n”);... }

But what now? Send data of course!  write()  read() Both are used by the client and the server To write and read  ssize_t read(int fd, void* buf, size_t len);  ssize_t write(int ffd, const void* buf, size_t len); read(sockfd, buffer, sizeof(buffer)); write(sockfd, “what’s up?\n”, strlen(“what’s up?\n”)); read(sockfd, buffer, sizeof(buffer)); write(sockfd, “what’s up?\n”, strlen(“what’s up?\n”));

Server Client socket() connect() write() read() close() socket() bind() listen() accept() write() read() close() read() EOF Connection Request Client / Server Session

You must close() it!  Just like a file (since it appears as one!) What next? Loop around…  Accept new connections  Process requests  Close them  Rinse, repeat What’s missing here?

Clients User 1 (goes to lunch) Server connect() accept() fgets() User 2 read() connect() Blocked! Blocks!

“[…]a property of systems in which several computational processes are executing at the same time[…]” (thanks Wikipedia!)

Threads  Natural concurrency (new thread per connection)  Easier to understand (you know it already)  Complexity is increased (possible race conditions) Use non-blocking I/O  Uses select()  Explicit control flow (no race conditions!)  Explicit control flow more complicated though There are good arguments for each but you must use select() !

Start with allowing address re-use Then we set the socket to non-blocking int sock, opts; sock = socket(…); // getting the current options setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts)); int sock, opts; sock = socket(…); // getting the current options setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts)); // getting current options if (0 > (opts = fcntl(sock, F_GETFL))) printf(“Error…\n”); // modifying and applying opts = (opts | O_NONBLOCK); if (fcntl(sock, F_SETFL, opts)) printf(“Error…\n”); bind(…); // getting current options if (0 > (opts = fcntl(sock, F_GETFL))) printf(“Error…\n”); // modifying and applying opts = (opts | O_NONBLOCK); if (fcntl(sock, F_SETFL, opts)) printf(“Error…\n”); bind(…);

Monitor sockets with select()  int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout); So what’s an fd_set ?  Bit vector with FD_SETSIZE bits maxfd – Max file descriptor + 1 readfs – Bit vector of read descriptors to monitor writefds – Bit vector of write descriptors to monitor exceptfds – Read the manpage, set to NULL timeout – How long to wait with no activity before returning, NULL for eternity

struct sockaddr_in saddr, caddr; int sockfd, clen, isock; unsigned short port = 80; if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0))) printf(“Error creating socket\n”); memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address saddr.sin_port = htons(port); // specify port to listen on if (0 > (bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr))) printf(“Error binding\n”); if (listen(sockfd, 5) < 0) { // listen for incoming connections printf(“Error listening\n”); clen = sizeof(caddr) // Setup your read_set with FD_ZERO and the server socket descriptor while (1) { pool.ready_set = &pool.read_set; pool.nready = select(pool.maxfd+1, &pool.ready_set, &pool.write_set, NULL, NULL); if (FD_ISSET(sockfd, &pool.ready_set)) { if (0 > (isock = accept(sockfd, (struct sockaddr *) &caddr, &clen))) printf(“Error accepting\n”); add_client(isock, &caddr, &pool); } check_clients(&pool); } // close it up down here struct sockaddr_in saddr, caddr; int sockfd, clen, isock; unsigned short port = 80; if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0))) printf(“Error creating socket\n”); memset(&saddr, '\0', sizeof(saddr)); // zero structure out saddr.sin_family = AF_INET; // match the socket() call saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind to any local address saddr.sin_port = htons(port); // specify port to listen on if (0 > (bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr))) printf(“Error binding\n”); if (listen(sockfd, 5) < 0) { // listen for incoming connections printf(“Error listening\n”); clen = sizeof(caddr) // Setup your read_set with FD_ZERO and the server socket descriptor while (1) { pool.ready_set = &pool.read_set; pool.nready = select(pool.maxfd+1, &pool.ready_set, &pool.write_set, NULL, NULL); if (FD_ISSET(sockfd, &pool.ready_set)) { if (0 > (isock = accept(sockfd, (struct sockaddr *) &caddr, &clen))) printf(“Error accepting\n”); add_client(isock, &caddr, &pool); } check_clients(&pool); } // close it up down here

A struct something like this: typedef struct s_pool { int maxfd; // largest descriptor in sets fd_set read_set; // all active read descriptors fd_set write_set; // all active write descriptors fd_set ready_set;// descriptors ready for reading int nready;// return of select() int clientfd[FD_SETSIZE];// max index in client array // might want to write this read_buf client_read_buf[FD_SETSIZE]; // what else might be helpful for project 1? } pool; typedef struct s_pool { int maxfd; // largest descriptor in sets fd_set read_set; // all active read descriptors fd_set write_set; // all active write descriptors fd_set ready_set;// descriptors ready for reading int nready;// return of select() int clientfd[FD_SETSIZE];// max index in client array // might want to write this read_buf client_read_buf[FD_SETSIZE]; // what else might be helpful for project 1? } pool;

void FD_ZERO(fd_set *fdset);  Clears all the bits void FD_SET(int fd, fd_set *fdset);  Sets the bit for fd void FD_CLR(int fd, fd_set *fdset);  Clears the bit for fd int FD_ISSET(int fd, fd_set *fdset);  Checks whether fd’s bit is set

The code only tests for new incoming connections  But we have many more to test! Store all your client file descriptors  In pool is a good idea! Several scenarios  Clients are sending us data  We may have pending data to write in a buffer Keep the while(1) thin  Delegate specifics to functions that access the appropriate data  Keep it orthogonal! Note the design presented here is not the best  Think up your own!

Server Client(s) socket() connect() write() read() close() socket() bind() listen() select() write() read() close() read() EOF Connection Request Client / Server Session(s) FD_ISSET(sfd) accept() check_clients() main loop

IRC commands are terminated by a newline  But you might not get one at the end of a read() ! Buffers are your friend  read() returns exactly what is available—that might not be what you want!  If you don’t have an entire line, buffer it and wait for more (but don’t block!) Do not use the “Robust I/O” package from 213  It’s not robust  Don’t use anything from csapp.h

So what do I do now?  Read the handout (Tuesday!)  Come to recitation (Wednesday)  Meet with your partner This may be a progression goals to achieve…  Construct a simple echo server for a single client  Construct a simple client to talk to that server  Modify your server to work with multiple clients  Modify your echo server to be a chat server  IRC?

Version Control – Subversion Automated Build “Management” – Makefiles Automated Test “Management” – Makefiles Unit Tests – CUnit Integration Tests – Our custom test harness (or yours!) Debugging  Logging Macros  GDB  Valgrind (we’ll run it for you if you don’t!) Linked list and hash table library  You don’t have to write your own!

Team Programming  Code review (every check-in!)  Pair Programming (sometimes two sets of eyes are better!) Debugging  It will take days to figure some out! Writing Test Cases  Know how to find the corner cases! Design  Strive for orthogonal design, refactor to achieve it!

Start early  Most groups that did not do well on Project 1 last fall started the IRC server just days before its checkpoint…  Find a partner, before the handout is released Meet early and often  Set goals with each other  “I will have basic network code for an echo server by tomorrow”  Pair programming is useful  In the beginning it is difficult to start on something with no direction…plan it out together Work ahead of the checkpoints  Checkpoint scripts likely released a day prior to checkpoint… Read the manpages, please

project partners to Albert: academic.cs