1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles m We will look at using sockets in C.

Slides:



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

Socket Programming CS3320 Fall 2010.
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.
1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles m We will look at using sockets in C.
Networks: TCP/IP Socket Calls1 Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
1 Netcomm Recitation 1: Sockets Communication Networks Recitation 1.
1 Netcomm Sockets Communication Networks Recitation 1.
Socket Programming: a Primer Socket to me!. Feb. 23, 2001EE122, UCB2 Why does one need sockets? application network protocol sockets network.
תקשורת באינטרנט Tutorial 8. 2 n Socket programming u What is socket ? u Sockets architecture u Types of Sockets u The Socket system calls u Data Transfer.
Sockets Programming Introduction © Dr. Ayman Abdel-Hamid, CS4254 Spring CS4254 Computer Network Architecture and Programming Dr. Ayman A. Abdel-Hamid.
Tutorial 8 Socket Programming
TDC561 Network Programming Camelia Zlatea, PhD Week 2 – part II: Socket Application Programming Interface.
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.
Protocol Programs that communicate across a network must agree on a protocol on how they will communicate High-level decisions must be made on which program.
1 Tutorial on Socket Programming Computer Networks - CSC 458 Department of Computer Science Yukun Zhu (Slides are mainly from Monia Ghobadi, and Amin Tootoonchian,
1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles.
Basic Socket Programming TCP/IP overview. TCP interface Reference: –UNIX Network Programming, by Richard Stevens. –UNIX man page.
Socket Programming Based on tutorial prepared by EUISOK CHUNG CS3320 Spring2008.
CPSC 441 TUTORIAL – JANUARY 18, 2012 TA: MARYAM ELAHI INTRODUCTION TO SOCKET PROGRAMMING WITH C.
TCP Socket Programming. r An abstract interface provided to the application programmer  File descriptor, allows apps to read/write to the network r Allows.
ECE453 – Introduction to Computer Networks Lecture 15 – Transport Layer (II)
ECE 4110 – Internetwork Programming Client-Server Model.
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.
UNIX Network Programming1 UNIX Network Programming 2nd Edition.
Sirak Kaewjamnong Computer Network Systems
 Wind River Systems, Inc Chapter - 13 Network Programming.
1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles m We will look at using sockets in C.
CS x760 Computer Networks1 Socket Programming. CS 6760 Computer Networks2 Socket Programming  What is a socket?  Using sockets  Types (Protocols) ‏
Ports Port - A 16-bit number that identifies the application process that receives an incoming message. Reserved ports or well-known ports (0 to 1023)
Computer Networks : TP1 Prof. Dr. Amine Berqia and Prof. Dr. Fernando Lobo {bamine,
1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles m We will look at using sockets in C.
1 Introduction to Computer Networks Ilam University By: Dr. Mozafar Bag Mohammadi Sockets.
Networking Tutorial Special Interest Group for Software Engineering Luke Rajlich.
1 Computer Networks An Introduction to Computer Networks University of Tehran Dept. of EE and Computer Engineering By: Dr. Nasser Yazdani Lecture 3: Sockets.
University of Calgary – CPSC 441.  A socket is an interface between the application and the network (the lower levels of the protocol stack)  The application.
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 Tutorial Department of Computer Science Southern Illinois University Edwardsville Fall, 2015 Dr. Hiroshi Fujinoki
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.
1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles m We will look at using sockets in C m Note:
Introduction A Simple Daytime Client A Simple Daytime Server
2: Application Layer 1 Socket Programming UNIX Network Programming, Socket Programming Tutorial:
CSCI 330 UNIX and Network Programming Unit XIV: User Datagram Protocol.
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.
Lecture 3 TCP and UDP Sockets CPE 401 / 601 Computer Network Systems slides are modified from Dave Hollinger.
@Yuan Xue CS 283Computer Networks Spring 2013 Instructor: Yuan Xue.
1 Socket Interface. 2 Client-Server Architecture The client is the one who speaks first Typical client-server situations  Client and server on the same.
Socket Programming(1/2). Outline  1. Introduction to Network Programming  2. Network Architecture – Client/Server Model  3. TCP Socket Programming.
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 What is a socket? Using sockets Types (Protocols)
CSCE 313 Network Socket MP8 DUE: FRI MAY 5, 2017
Network Programming CSC- 341
Socket Programming in C
Introduction to Computer Networks
Transport layer API: Socket Programming
Socket Programming What is a socket? Using sockets Types (Protocols)
TCP/IP Socket Programming in C
Socket Programming What is a socket? Using sockets Types (Protocols)
Socket Programming(1/2)
Socket Programming What is a socket? Using sockets Types (Protocols)
Sockets Programming Socket to me!.
Sockets Programming Socket to me!.
Internet Networking recitation #8
Socket Programming What is a socket? Using sockets Types (Protocols)
Presentation transcript:

1 Socket Programming r What is a socket? r Using sockets m Types (Protocols) m Associated functions m Styles m We will look at using sockets in C

2 What is a socket? r An interface between application and network m The application creates a socket m The socket type dictates the style of communication reliable vs. best effort connection-oriented vs. connectionless r Once configured the application can m pass data to the socket for network transmission m receive data from the socket (transmitted through the network by some other host)

3 Two essential types of sockets r SOCK_STREAM m a.k.a. TCP m reliable delivery m in-order guaranteed m connection-oriented m bidirectional r SOCK_DGRAM m a.k.a. UDP m unreliable delivery m no order guarantees m no notion of “connection” – app indicates dest. for each packet m can send or receive App socket Dest. App socket D1 D3 D2 Q: why have type SOCK_DGRAM ?

4 Socket Creation in C: socket r int s = socket(domain, type, protocol);  s : socket descriptor, an integer (like a file-handle)  domain : integer, communication domain e.g., PF_INET (IPv4 protocol) – typically used  type : communication type SOCK_STREAM : reliable, 2-way, connection-based service SOCK_DGRAM : unreliable, connectionless, other values: need root permission, rarely used, or obsolete  protocol : specifies protocol (see file /etc/protocols for a list of options) - usually set to 0  NOTE: socket call does not specify where data will be coming from, nor where it will be going to – it just creates the interface!

5 A Socket-eye view of the Internet r Each host machine has an IP address r When a packet arrives at a host medellin.cs.columbia.edu ( ) cluster.cs.columbia.edu ( , , , ) newworld.cs.umass.edu ( )

6 Ports Port 0 Port 1 Port r Each host has 65,536 ports r Some ports are reserved for specific apps m 20,21: FTP m 23: Telnet m 80: HTTP m see RFC 1700 (about 2000 ports are reserved) r A socket provides an interface to send data to/from the network through a port

7 Addresses, Ports and Sockets r Like apartments and mailboxes m You are the application m Your apartment building address is the address m Your mailbox is the port m The post-office is the network m The socket is the key that gives you access to the right mailbox (one difference: assume outgoing mail is placed by you in your mailbox) r Q: How do you choose which port a socket connects to?

8 The bind function r associates and (can exclusively) reserves a port for use by the socket r int status = bind(sockid, &addrport, size);  status : error status, = -1 if bind failed  sockid : integer, socket descriptor  addrport : struct sockaddr, the (IP) address and port of the machine (address usually set to INADDR_ANY – chooses a local address)  size : the size (in bytes) of the addrport structure  bind can be skipped for both types of sockets. When and why?

9 Skipping the bind  SOCK_DGRAM : m if only sending, no need to bind. The OS finds a port each time the socket sends a pkt m if receiving, need to bind  SOCK_STREAM : m destination determined during conn. setup m don’t need to know port sending from (during connection setup, receiving end is informed of port)

10 Connection Setup ( SOCK_STREAM )  Recall: no connection setup for SOCK_DGRAM r A connection occurs between two kinds of participants m passive: waits for an active participant to request connection m active: initiates connection request to passive side r Once connection is established, passive and active participants are “similar” m both can send & receive data m either can terminate the connection

11 Connection setup cont’d r Passive participant  step 1: listen (for incoming requests)  step 3: accept (a request) m step 4: data transfer r The accepted connection is on a new socket r The old socket continues to listen for other active participants r Why? r Active participant  step 2: request & establish connect ion m step 4: data transfer Passive Participant l-socka-sock-1a-sock-2 Active 1 socket Active 2 socket

12 Connection setup: listen & accept r Called by passive participant r int status = listen(sock, queuelen);  status : 0 if listening, -1 if error  sock : integer, socket descriptor  queuelen : integer, # of active participants that can “wait” for a connection  listen is non-blocking: returns immediately r int s = accept(sock, &name, &namelen);  s : integer, the new socket (used for data-transfer)  sock : integer, the orig. socket (being listened on)  name : struct sockaddr, address of the active participant  namelen : sizeof(name): value/result parameter must be set appropriately before call adjusted by OS upon return  accept is blocking: waits for connection before returning

13 connect call r int status = connect(sock, &name, namelen);  status : 0 if successful connect, -1 otherwise  sock : integer, socket to be used in connection  name : struct sockaddr : address of passive participant  namelen : integer, sizeof(name)  connect is blocking

14 Sending / Receiving Data  With a connection ( SOCK_STREAM ): m int count = send(sock, &buf, len, flags); count : # bytes transmitted (-1 if error) buf : char[], buffer to be transmitted len : integer, length of buffer (in bytes) to transmit flags : integer, special options, usually just 0 m int count = recv(sock, &buf, len, flags); count : # bytes received (-1 if error) buf : void[], stores received bytes len : # bytes received flags : integer, special options, usually just 0 m Calls are blocking [returns only after data is sent (to socket buf) / received]

15 Sending / Receiving Data (cont’d)  Without a connection ( SOCK_DGRAM ): m int count = sendto(sock, &buf, len, flags, &addr, addrlen); count, sock, buf, len, flags : same as send addr : struct sockaddr, address of the destination addrlen : sizeof(addr) m int count = recvfrom(sock, &buf, len, flags, &addr, &addrlen); count, sock, buf, len, flags: same as recv name : struct sockaddr, address of the source namelen : sizeof(name): value/result parameter r Calls are blocking [returns only after data is sent (to socket buf) / received]

16 close r When finished using a socket, the socket should be closed: r status = close(s);  status : 0 if successful, -1 if error  s : the file descriptor (socket being closed) r Closing a socket  closes a connection (for SOCK_STREAM ) m frees up the port used by the socket

17 The struct sockaddr r The generic: struct sockaddr { u_short sa_family; char sa_data[14]; };  sa_family specifies which address family is being used determines how the remaining 14 bytes are used r The Internet-specific: struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; m sin_family = AF_INET  sin_port : port # ( )  sin_addr : IP-address  sin_zero : unused

18 Address and port byte-ordering r Address and port are stored as integers m u_short sin_port; (16 bit) m in_addr sin_addr; (32 bit) struct in_addr { u_long s_addr; }; r Problem: m different machines / OS’s use different word orderings little-endian: lower bytes first big-endian: higher bytes first m these machines may communicate with one another over the network Big-Endian machine Little-Endian machine WRONG!!!

19 Solution: Network Byte-Ordering r Defs: m Host Byte-Ordering: the byte ordering used by a host (big or little) m Network Byte-Ordering: the byte ordering used by the network – always big-endian r Any words sent through the network should be converted to Network Byte-Order prior to transmission (and back to Host Byte-Order once received) r Q: should the socket perform the conversion automatically? r Q: Given big-endian machines don’t need conversion routines and little-endian machines do, how do we avoid writing two versions of code?

20 UNIX’s byte-ordering funcs r u_long htonl(u_long x); r u_short htons(u_short x); r u_long ntohl(u_long x); r u_short ntohs(u_short x); r On big-endian machines, these routines do nothing r On little-endian machines, they reverse the byte order r Same code would have worked regardless of endian- ness of the two machines Big-Endian machine Little-Endian machine htonl ntohl

21 Dealing with blocking calls r Many of the functions we saw block until a certain event  accept : until a connection comes in  connect : until the connection is established  recv, recvfrom : until a packet (of data) is received  send, sendto : until data is pushed into socket’s buffer Q: why not until received? r For simple programs, blocking is convenient r What about more complex programs? m multiple connections m simultaneous sends and receives m simultaneously doing non-networking processing

22 Dealing w/ blocking (cont’d) r Options: m create multi-process or multi-threaded code  turn off the blocking feature (e.g., using the fcntl file- descriptor control function)  use the select function call.  What does select do? m can be permanent blocking, time-limited blocking or non- blocking m input: a set of file-descriptors m output: info on the file-descriptors’ status m i.e., can identify sockets that are “ready for use”: calls involving that socket will return immediately

23 Other useful functions  bzero(char* c, int n): 0’s n bytes starting at c  gethostname(char *name, int len): gets the name of the current host  gethostbyaddr(char *addr, int len, int type): converts IP hostname to structure containing long integer  inet_addr(const char *cp): converts dotted-decimal char-string to long integer  inet_ntoa(const struct in_addr in): converts long to dotted-decimal notation r Warning: check function assumptions about byte- ordering (host or network). Often, they assume parameters / return solutions in network byte- order

24 Release of ports  Sometimes, a “rough” exit from a program (e.g., ctrl-c ) does not properly free up a port r Eventually (after a few minutes), the port will be freed r To reduce the likelihood of this problem, include the following code: #include void cleanExit(){exit(0);} m in socket code: signal(SIGTERM, cleanExit); signal(SIGINT, cleanExit);

25 Example – Daytime Server/Client TCP MAC driver Daytime client IP Network TCP Daytime server IP MAC driver Application protocol TCP protocol IP protocol MAC-level protocol Actual data flow Socket API MAC = media access control

26 TCP Daytime client r Connects to a daytime server r Retrieves the current date and time % gettime Thu Sept 05 15:50:

27 #include "unp.h" int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if( argc != 2 )err_quit(“usage : gettime ”); /* Create a TCP socket */ if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_sys("socket error"); /* Specify server’s IP address and port */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(13); /* daytime server port */ if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) err_quit("inet_pton error for %s", argv[1]);

28 /* Connect to the server */ if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0) err_sys("connect error"); /* Read the date/time from socket */ while ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ printf(“%s”, recvline); } if (n < 0) err_sys("read error"); close(sockfd); }

29 Simplifying error-handling int Socket(int family, int type, int protocol) { int n; if ( (n = socket(family, type, protocol)) < 0) err_sys("socket error"); return n; }

30 r Waits for requests from Client r Accepts client connections r Send the current time r Terminates connection and goes back waiting for more connections. TCP Daytime Server

31 #include "unp.h" #include int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE]; time_t ticks; /* Create a TCP socket */ listenfd = Socket(AF_INET, SOCK_STREAM, 0); /* Initialize server’s address and well-known port */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(13); /* daytime server */ /* Bind server’s address and port to the socket */ Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

32 /* Convert socket to a listening socket */ Listen(listenfd, LISTENQ); for ( ; ; ) { /* Wait for client connections and accept them */ connfd = Accept(listenfd, (SA *) NULL, NULL); /* Retrieve system time */ ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); /* Write to socket */ Write(connfd, buff, strlen(buff)); /* Close the connection */ Close(connfd); }

33 The Socket Structure INET Address struct in_addr { in_addr_t s_addr; /* 32-bit IPv4 address */ } INET Socket Struct sockaddr_in { uint8_t sin_len; /* length of structure (16) */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16-bit TCP/UDP port number */ struct in_addr sin_addr; /* 32-bit IPv4 address */ char sin_zero[8]; /* unused */ }

34 UDP Client Code r #include r #define MY_PORT_ID 6089 r #define SERVER_PORT_ID 6090 r #define SERV_HOST_ADDR " " r main(){ int sockid, retcode; r struct sockaddr_in my_addr, server_addr; r char msg[12];

35 UDP Client (cont.) r printf("Client: creating socket\n"); r if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("Client: socket failed: %d\n",errno); exit(0); } r printf("Client: binding my local socket\n"); bzero((char *) &my_addr, sizeof(my_addr)); r my_addr.sin_family = AF_INET; r my_addr.sin_addr.s_addr = htonl(INADDR_ANY); r my_addr.sin_port = htons(MY_PORT_ID); r if ( (bind(sockid, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0) ) { printf("Client: bind fail: %d\n",errno); exit(0); }

36 UDP Client (fin) r printf("Client: creating addr structure for server\n"); r bzero((char *) &server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; r server_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR); r server_addr.sin_port = htons(SERVER_PORT_ID); r printf("Client: initializing message and sending\n"); r sprintf(msg, "Hello world"); retcode = r sendto(sockid,msg,12,0,(struct sockaddr *) &server_addr, sizeof(server_addr)); r if (retcode <= -1) {printf("client: sendto failed: %d\n",errno); exit(0); } r /* close socket */ r close(sockid); }

37 UDP Server r #include r #define MY_PORT_ID 6090 /* a number > 5000 */ r main(){ r int sockid, nread, addrlen; r struct sockaddr_in my_addr, client_addr; r char msg[50];

38 UDP Server (cont) r printf("Server: creating socket\n"); r if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("Server: socket error: %d\n",errno); exit(0); } r printf("Server: binding my local socket\n"); r bzero((char *) &my_addr, sizeof(my_addr)); r my_addr.sin_family = AF_INET; r my_addr.sin_addr.s_addr = htons(INADDR_ANY); r my_addr.sin_port = htons(MY_PORT_ID); r if ( (bind(sockid, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0) ) { printf("Server: bind fail: %d\n",errno); exit(0); }

39 UDP Server (end) r printf("Server: starting blocking message read\n"); r nread = recvfrom(sockid,msg,11,0, (struct sockaddr *) &client_addr, &addrlen); r printf("Server: return code from read is %d\n",nread); r if (nread >0) printf("Server: message is: %s\n",msg); r close(sockid); r }