Download presentation
Presentation is loading. Please wait.
Published byTheodore Francis Modified over 8 years ago
1
1 Introduction to Computer Networks Ilam University By: Dr. Mozafar Bag Mohammadi Sockets
2
2 Outline r What is a socket? r Types of sockets r Uses of sockets r Socket function r Byte order r Dealing with blocking r Some useful function
3
3 r Goal- Communication between two processes r They use interface/services from the transport layer. The interface is called Application Programming Interface, API. Client process Server process TCP/UDP IP Ethernet Adaptor Socket API Socket programming
4
4 What is a socket? r An API between application and network m Define an “end- point” for communication m The application creates a socket m The socket type dictates the style of communication reliable vs. best effort connection-oriented vs. connectionless m Initiate and accept a connection 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) m Terminate a connection gracefully r Berkeley Sockets are the most common (from BSD Unix)
5
5 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 3 2 1 Dest. App socket 3 2 1 D1 D3 D2 Q: why have type SOCK_DGRAM ?
6
6 Client- Server communication (UDP) socket() to create socket bind() to a receiving port recvfrom () sendto() socket() to create scoket bind() to any port recvfrom () sendto () server client
7
7 Client- Server communication (TCP) socket() bind() to a receiving port listen () to socket Accept() connection socket() bind() to any port connect () to server send() recv() send() recv() server client
8
8 Example A generic server (FTP) :Wait for connections on a port When a client connection comes in, loop: – Read in the client’s request – Read data from a file – Send the data to the client – Disconnect when we have reached EOF A generic client, high level : Connect to a given server loop: – Send a request to the server – Read server’s response – Read server’s data – Disconnect when we have reached EOF
9
9 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, PF_UNIX 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!
10
10 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 (128.59.21.14) cluster.cs.columbia.edu (128.59.21.14, 128.59.16.7, 128.59.16.5, 128.59.16.4) newworld.cs.umass.edu (128.119.245.93)
11
11 Ports Port 0 Port 1 Port 65535 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
12
Well-known ports 12
13
13 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!)
14
14 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, m struct sockaddr_in { u_char sin_family; /* Address Family */ u_short sin_port; /* Port number */ struct in_addr sin_addr; /* IP address */ char sin_zero[8]; /* unused */ }; size : the size (in bytes) of the addrport structure
15
15 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)
16
16 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
17
17 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
18
18 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 original 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
19
19 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
20
20 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]
21
21 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]
22
22 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
23
23 Example: TCP Server program r Make a socket #include int fd, newfd, nbytes, nbytes2; char buf[512], response[512]; struct sockaddr_in srv; fd = socket(AF_INET, SOCK_STREAM, 0);
24
24 Example: TCP Server program r The socket was created now bind it to a port and host. srv.sin_family = AF_INET; srv.sin_port = htons(80); srv.sin_addr.s_addr = inet_addr(``128.2.15.9''); /* or srv.sin_addr.s_addr = htonl(IN_ADDR_ANY) bind(fd, (struct sockaddr*) &srv, sizeof(srv)); r Now sit and listen; listen(fd, 5); r Now, accept any connection. First, clear the structure. struct sockaddr_in cli; int cli_len; bzero((char*)&cli, sizeof( cli)); newfd = accept(fd, (struct sockaddr*) &cli, &cli_len); Server address Server port
25
25 Example: TCP Server program r Now it can read from socket, newfd, and write to socket, newfd. int BUF_ SIZE = 1024, bytesrecv = 0; char buf[ BUF_ SIZE]; /* receives up to BUF_ SIZE bytes from sock and stores them in buf. */ bytesrecv = recv( newfd, buf, BUF_ SIZE, 0); /* send up BUF_ SIZE bytes */ bytesrecv = send( newfd, buf, BUF_ SIZE, 0); r At the end, we need to close both sockets by close command. close( newfd); /* closes the socket newfd */ close( fd); /* closes the socket fd */
26
26 Example: TCP client program int fd, newfd, nbytes, nbytes2; char buf[512], response[512]; struct sockaddr_in srv; fd = socket(AF_INET, SOCK_STREAM, 0); r The same as server. Now, it needs to connect to server. srv.sin_family = AF_INET; srv.sin_port = htons(80); srv.sin_addr.s_addr = inet_addr(``128.2.15.9''); /*or srv.sin_addr.s_addr = inet_addr(argv[1]); /*or inet_aton( argv[1], &srv.sin_addr); /*or inet_pton(AF_INET, argv[1], &srv.sin_addr); connect(fd, (struct sockaddr*) &srv, sizeof(srv)); r Connect is blocking and send a SYN signal and is blocked until receive SYNACK, (three way handshaking) r It can start now reading and writing sprintf(request, ``Here's my request''); nbytes2 = write(fd, request, strlen(request)); close(fd); Server address Server port Better than inet_addr
27
27 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 128.119.40.12 1281194012 12.40.119.128 1281194012 Big-Endian machine Little-Endian machine WRONG!!!
28
28 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?
29
29 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 128.119.40.12 1281194012 128.119.40.12 1281194012 Big-Endian machine Little-Endian machine htonl ntohl 12811940121281194012
30
30 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
31
31 Dealing with 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
32
32 select function call r int status = select(nfds, &readfds, &writefds, &exceptfds, &timeout); status : # of ready objects, -1 if error nfds : 1 + largest file descriptor to check readfds : list of descriptors to check if read-ready writefds : list of descriptors to check if write-ready exceptfds : list of descriptors to check if an exception is registered timeout : time after which select returns, even if nothing ready - can be 0 or (point timeout parameter to NULL for )
33
33 To be used with select : Recall select uses a structure, struct fd_set m it is just a bit-vector if bit i is set in [ readfds, writefds, exceptfds ], select will check if file descriptor (i.e. socket) i is ready for [reading, writing, exception] Before calling select : FD_ZERO(&fdvar) : clears the structure FD_SET(i, &fdvar) : to check file desc. i After calling select : int FD_ISSET(i, &fdvar) : boolean returns TRUE iff i is “ready”
34
34 Other useful functions bzero(char* c, int n): 0’s n bytes starting at c in_addr_t inet_addr(const char *cp): converts dotted-decimal char-string to long integer char* inet_ntoa(const struct in_addr in): converts long to dotted-decimal notation int inet_aton(const char *cp, const struct in_addr in); 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 r Warning: check function assumptions about byte-ordering (host or network). Often, they assume parameters / return solutions in network byte-order
35
35 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);
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.