UNIX Internet Socket API

Slides:



Advertisements
Similar presentations
Introduction to Sockets Jan Why do we need sockets? Provides an abstraction for interprocess communication.
Advertisements

Sockets: Network IPC Internet Socket UNIX Domain Socket.
Elementary TCP Sockets Computer Networks Computer Networks Term B10 UNIX Network Programming Vol. 1, Second Ed. Stevens Chapter 4.
Sockets Programming CS144 Review Session 1 April 4, 2008 Ben Nham.
Networks: TCP/IP Socket Calls1 Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
Multimedia Networking Sockets. Outline Socket basics Socket details (TCP and UDP) Socket options Final notes.
Socket Programming: a Primer Socket to me!. Feb. 23, 2001EE122, UCB2 Why does one need sockets? application network protocol sockets network.
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.
Winsock programming.  TCP/IP UDP TCP  Winsock #include wsock32.lib.
Introduction to Project 1 Web Client and Server Jan 2006.
Computer Networks Sockets. Outline F Socket basics F Socket details.
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.
UNIX Socket Programming CS 6378
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.
Socket Programming. Introduction Sockets are a protocol independent method of creating a connection between processes. Sockets can be either – Connection.
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.
Communication. References r The 402 web site has many links to socket tutorials. r Chapter 2.1 of the Tanenbaum, van Steen textbook r Chapter 15, of the.
Socket Programming Lec 2 Rishi Kant. Review of Socket programming Decide which type of socket – stream or datagram. Based on type create socket using.
Networking Tutorial Special Interest Group for Software Engineering Luke Rajlich.
CSCE 515: Computer Network Programming UDP Socket Wenyuan Xu Department of Computer Science and Engineering.
Elementary TCP Sockets UNIX Network Programming Vol. 1, Second Ed. Stevens Chapter 4.
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.
1 Sockets Programming Socket to me!. 2 Network Application Programming Interface (API) The services provided by the operating system that provide the.
Programming with UDP – II Covered Subjects: Creating UDP sockets Client Server Sending data Receiving data Connected mode.
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: HsinYu Ha.
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.
Lecture 15 Socket Programming CPE 401 / 601 Computer Network Systems slides are modified from Dave Hollinger.
OPERATING SYSTEMS COURSE THE HEBREW UNIVERSITY SPRING Sockets.
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.
Socket programming Péter Verhás August 2002
CS 3700 Networks and Distributed Systems
Socket Programming in C
Review: TCP Client-Server Interaction
Imam Ahmad Trinugroho, ST., MMSI
Tutorial on Socket Programming
Transport layer API: Socket Programming
CS 3700 Networks and Distributed Systems
תקשורת ומחשוב תרגול 3-5 סוקטים ב-C.
Socket Programming in C
TCP Sockets Programming
Socket Programming.
Sockets Programming Socket to me!.
Sockets Programming Socket to me!.
Internet Networking recitation #8
Sockets.
Presentation transcript:

UNIX Internet Socket API 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 a file descriptor. A file descriptor is simply an integer associated with an open file. The file can be: Network connection. Pipes. A real file on-the-disk. Just about anything else.

Two Types of Network Sockets Connection Oriented Sockets Datagram Sockets

Connection Oriented Sockets Stream sockets are reliable two-way connected communication streams, both FIFO and Error free. The “Transmission Control Protocol", otherwise known as "TCP“. TCP makes sure your data arrives sequentially and error-free. Used by Applications/Protocols: Telnet HTTP FTP

Datagram sockets Connectionless? You don't have to maintain an open connection as you do with stream sockets. You just build a packet and send it out. Whenever you send a datagram: it may arrive. It may arrive out of order or duplicate. If it arrives, the data within the packet will be error-free. The “User Datagram Protocol ", otherwise known as “UDP“. What is it good for? UDP uses a simple transmission model without implicit hand-shaking dialogues for guaranteeing reliability, ordering, or data integrity. Thus, UDP provides an unreliable service and datagrams may arrive out of order, appear duplicated, or go missing without notice. UDP assumes that error checking and correction is either not necessary or performed in the application, avoiding the overhead of such processing at the network interface level. Time-sensitive applications often use UDP because dropping packets is preferable to using delayed packets. If error correction facilities are needed at the network interface level. UDP's stateless nature is also useful for servers that answer small queries from huge numbers of clients. Unlike TCP, UDP is compatible with packet broadcast (sending to all on local network) and multicasting (send to all subscribers).

Technical Stuff

struct sockaddr struct sockaddr { unsigned short sa_family; char sa_data[14]; }; Address family in this presentation: AF_INET Contains a destination address and port number for the socket. The port number is used by the kernel to match an incoming packet to a certain process's socket descriptor.

struct sockaddr_in struct sockaddr_in { }; short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }; This structure makes it easy to reference elements of the socket address. Note that sin_zero should be set to all zeros with the function memset().

struct sockaddr_in A pointer to a struct sockaddr_in can be cast to a pointer to a struct sockaddr and vice- versa. Also, notice that sin_family corresponds to sa_family in a struct sockaddr and should be set to "AF_INET". Finally, the sin_port and sin_addr (unsigned long ) must be in Network Byte Order! struct in_addr { uint32_t s_addr; };

structs and Data Handling A socket descriptor is just a regular int. There are two byte orderings: Most significant byte first a.k.a. "Network Byte Order". Least significant byte first. In order to convert "Host Byte Order“ to Network Byte Order, you have to call a function.

Big\Little Endian

Convert! There are two types that you can convert: short and. These functions work for the unsigned variations as well. htons() - "Host to Network Short" htonl() - "Host to Network Long" ntohs() - "Network to Host Short" ntohl() - "Network to Host Long“ Be portable! Remember: put your bytes in Network Byte Order before you put them on the network.

IP Addresses #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; my_addr.sin_port = htons(3490); inet_aton("10.12.110.57", &(my_addr.sin_addr)); memset(&(my_addr.sin_zero), '\0', 8); inet_aton(), unlike practically every other socket-related function, returns non-zero on success, and zero on failure.

Making the Connection

socket system call #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain - should be set to PF_INET. type - SOCK_STREAM or SOCK_DGRAM. protocol - set to 0, Let the kernel choose the correct protocol based on the type. socket() simply returns to you a file (i.e. socket) descriptor that you can use in later system calls, or -1 on error and sets errno to the error's value.

bind system call Once you have a socket, you might have to associate that socket with a port on your local machine (address). This is commonly done if you're going to listen() for incoming connections on a specific port. int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

bind system call cont. All ports below 1024 are reserved. HTTP 80 Telnet 23 You can have any available port number above that, right up to 65535 In order to use my IP address. my_addr.sin_addr.s_addr = htonl(INADDR_ANY); bind() also returns -1 on error and sets errno to the error's value. In order to choose an unused port at random my_addr.sin_port = htons(0); Htons = host to network order. (for two different system) - most-significant byte first,- big-endian increasing numeric significance with increasing memory addresses or increasing time, known as little-endian, For TCP/IP, if the port is specified as zero, the service provider assigns a unique port to the application with a value between 1024 and 5000. The application can use getsockname after calling bind to learn the address and the port that has been assigned to it. If the Internet address is equal to INADDR_ANY, getsockname cannot necessarily supply the address until the socket is connected,

bind system call cont. When we get - “Address already in use.” We can wait, or we can add the following code: int yes=1; If (setsockopt (listener, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int)) == - 1) { perror("setsockopt"); exit(1); }

listen system call int listen(int sockfd, int backlog); Wait for incoming connections and handle them in some way. The process is two step: first you listen(), then you accept(). sockfd is the usual socket file descriptor from the socket() system call. backlog is the number of connections allowed on the incoming queue. As usual, listen() returns -1 and sets errno on error.

Stream Style

accept system call Scenario: A client will try to connect() to your machine on a port that you are listen()ing on. Their connection will be queued up waiting to be accept()ed. You call accept() and you tell it to get the pending connection. It’ll return to you a brand new socket file descriptor to use for this single connection!

accept system call cont. int accept(int sockfd, void *addr, int *addrlen); sockfd is the listen()ing socket descriptor. addr will usually be a pointer to a local struct sockaddr_in. This is where the information about the incoming connection will go. addrlen is a local integer variable that should be set to sizeof(struct sockaddr_in) before its address is passed to accept(). As usual, accept() returns -1 and sets errno on error.

connect system call int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); sockfd is socket file descriptor. serv_addr is a struct sockaddr containing the destination port and IP address. addrlen can be set to sizeof(struct sockaddr). Be sure to check the return value from connect()-it'll return -1 on error and set the variable errno.

Summary if you're going to be listening for incoming connections, the sequence of system calls you'll make is: socket(); bind(); listen(); accept();

send() system call int send(int sockfd, const void *msg, int len, int flags); sockfd is the socket descriptor you want to send data to. msg is a pointer to the data you want to send. len is the length of that data in bytes. flags set to 0. send() returns the number of bytes actually sent out. - 1 is returned on error, and errno is set to the error number.

recv() system call int recv(int sockfd, void *buf, int len, unsigned int flags); sockfd is the socket descriptor to read from buf is the buffer to read the information into. len is the maximum length of the buffer, flags can again be set to 0. recv() returns the number of bytes actually read into the buffer, or -1 on error with errno set, accordingly. recv() can return 0. This means the remote side has closed the connection.

Datagram Style

sendto() system call int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); This call is basically the same as the call to send() with the addition of two other pieces of information. to is a pointer to a struct sockaddr. tolen can simply be set to sizeof(struct sockaddr). Just like with send(), sendto() returns the number of bytes actually sent, or -1 on error.

recvfrom() system call int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); This is just like recv() with the addition of a couple fields. from is a pointer to a local struct sockaddr that will be filled with the IP address and port of the originating machine. fromlen is a pointer to a local int that should be initialized to sizeof(struct sockaddr). When the function returns, fromlen will contain the length of the address actually stored in from. recvfrom() returns the number of bytes received, or -1 on error with errno set accordingly.

close system call close(sockfd); This will prevent any more reads and writes to the socket. Anyone attempting to read or write the socket on the remote end will receive an error.

Summary Stream Socket Server Side Client Side socket(); bind(); listen(); accept(); send()/recv() Client Side socket(); connect(); send()/recv()

Summary Datagram Socket Talker side: socket(); connect();//op sendto(); Listener side: socket(); bind(); recvfrom(); By using connect(), talker can send \ receive to \ from a specific address. For this purpose, you don't have to use sendto() and recvfrom() you can simply use send() and recv().

Blocking Vs. Non-Blocking

Blocking Synchronous When you first create the socket descriptor with socket(), the kernel sets it to blocking. If you don't want a socket to be blocking, you have to make a call to fcntl(): #include <unistd.h> #include <fcntl.h> #include <sys/socket.h> sockfd = socket(AF_INET, SOCK_STREAM, 0); fcntl(sockfd, F_SETFL, O_NONBLOCK); If you try to read from a non-blocking socket and there’s no data there, it’s not allowed to block - it will return -1 and errno will be set to EWOULDBLOCK

Blocking Vs. Non Blocking If you put your program in a busy-wait looking for data on the socket, you’ll suck up CPU time. A more elegant solution for checking to see if there’s data waiting to be read comes in synchronous mechanism of select().

select() Synchronous I/O Multiplexing select() gives you the power to monitor several sockets at the same time. It will tell you which ones are ready for reading, which are ready for writing, and which sockets have raised exceptions. #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select() The parameter numfds should be set to the values of the highest file descriptor plus one. In order to manipulate fd_set use the following macros: FD_ZERO(fd_set *set) //clears the set FD_SET(int fd, fd_set *set) //adds fd to the set FD_CLR(int fd, fd_set *set) //removes fd from the set FD_ISSET(int fd, fd_set *set) //tests to see if fd is in the set.

select() If the time specified in struct timeval is exceeded and select() still hasn't found any ready file descriptors, it'll return so you can continue processing. struct timeval { int tv_sec; //seconds int tv_usec; //microseconds }; If you set the fields in your struct timeval to 0, select() will timeout immediately, effectively polling all the file descriptors in your sets. If you set the parameter timeout to NULL, it will never timeout, and will wait until the first file descriptor is ready.

select() if you don't care about waiting for a certain set, you can just set it to NULL in the call to select(). if you have a socket that you are listen()'ing to, you can check for a new connection by putting that socket’s file descriptor in the readfds set. On success, select() returns the number ready descriptors contained in the descriptor sets, which may be zero if the timeout expires before anything interesting happens. On error, -1 is returned, and errno is set appropriately;

Example int main() { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf("A key was pressed!\n"); else printf("Timed out.\n"); return 0; }

Address Related System Calls

getpeername The function getpeername() will tell you who is at the other end of a connected stream socket. The synopsis: int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); sockfd is the descriptor of the connected stream socket. addr is a pointer to a struct sockaddr that will hold the information about the other side of the connection, addrlen is a pointer to an int, that should be initialized to sizeof(struct sockaddr). The function returns -1 on error and sets errno accordingly.

Domain Name Service -gethostname DNS is an acronym for Domain Name Service. This service maps human-readable address (a.k.a. host names) to IP addresses. This allows computers to be accessed remotely by name instead of number. The function gethostname() returns the name of the computer that your program is running on. The name can then be used by gethostbyname() to determine the IP address of your local machine. #include <unistd.h> int gethostname(char *hostname, size_t size);

Domain Name Service - gethostbyname #include <netdb.h> struct hostent * gethostbyname(const char *name); returns a pointer to the filled struct hostent, or NULL on error.

struct hostent struct hostent { char *h_name;//Official name of the host. char **h_aliases;//Alternate names. int h_addrtype;//usually AF_INET. int h_length;//length of the address. char **h_addr_list; //network addresses for the host in N.B.O. }; #define h_addr h_addr_list[0]

Example int main(int argc, char *argv[]) { struct hostent *h; if (argc != 2) { fprintf(stderr, "usage: getip address\n"); exit(1); } if ((h=gethostbyname(argv[1])) == NULL) { herror("gethostbyname"); printf("Host name : %s\n", h->h_name); printf("IP Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr))); return 0;

IPv6 - The next-generation IPv4 is finished (all addresses given out) Bigger address space (128 bit) More security \ New features Supported by all the new operating system but still not so widespread….