Download - Sockets

Transcript
Page 1: Sockets

Sockets

Intro to Network Programming

Page 2: Sockets

Before the internet... Early computers were entirely isolated

No Internet No network No model No external communications whatsoever

Page 3: Sockets

Before the internet... However, early computers did have

many concepts we have already studied: File I/O Console I/O Shared memory Inner-process communication

Solution: extend existing concepts to allow for remote communication

Page 4: Sockets

Before the internet... Solution: sockets

A socket is nothing more than an end-point of a bidirectional inner-process communication flow.

A socket, in a Linux operation system, is a file descriptor – the exact same thing you get form a call to open().

Page 5: Sockets

Sockets Sockets are often described as a door,

gateway, or portal. The sender sends information through the

portal. The receiver receives the information.

To a programmer, the mechanism to get the information from the sender to receiver is abstracted away (TCP/IP, UDP/IP, etc).

Page 6: Sockets

Sockets Potential Problem: Many

programs could possibly be communicating externally at once. Web browser loading a page E-mail client checking e-mail Streaming radio/music in the

background …and a download going on.

Page 7: Sockets

Sockets Solution: UDP and TCP both provide

ports. A port is a 16-bit number to describe

which program on a computer the information is intended to be received by.

Example: By default, web servers always listen for

connections form clients on port 80. Written as: cs.illinois.edu:80

Page 8: Sockets

SocketsBobAlice

client server

I am Bobport 80.

I am acceptingconnections.

Talk to Bobport 80.

I will speak toAlice port 87.

resulting TCP connection identified by(Alice:87, Bob:46)

Page 9: Sockets

Programming with sockets… To create a socket in C, you make a

call to socket(). Definition: int socket(int domain, int type, int protocol);

Alternatively, accept() will return a socket file descriptor (we’ll see this later).

Page 10: Sockets

Programming with sockets… Definition: int socket(int domain,

int type, int protocol);

domain: Specifies a communication domain (eg: IPv4 v. IPv6).

type: Specifies what mechanism of communication is used (eg: stream v. datagram).

protocol: Specifies what protocol should be used (eg: TCP v. UDP).

Page 11: Sockets

Programming with sockets… If you wish to allow for others to

connect to your socket, you will need to bind() it to a port on the operating system. int bind(int socket, const struct

sockaddr *address, socklen_t address_len);

Page 12: Sockets

Programming with sockets… Now that you’ve created your

socket and bind()’d it to a port, you can listen for incoming connections! int listen(int socket, int backlog);

Page 13: Sockets

Programming with sockets… Now that you’ve created your socket

and bind()’d it to a port, you can listen for incoming connections! int listen(int socket, int backlog);

backlog: defines the maximum length for the queue of pending connections.

For most programs that will be constantly accept()’ing connections, a smallish value (5 or so) works great.

Page 14: Sockets

Programming with sockets… When you begin to listen() on your

socket: …you’ve told the operating system to

allow remote systems to connect at the specified port using the specified protocol.

…you haven’t had a way to actually get a socket to communicate with that remote system.

Page 15: Sockets

Programming with sockets… To receive a socket file descriptor

for an incoming connection, you accept() the incoming connection. int accept(int sockfd, struct sockaddr

*addr, socklen_t *addrlen);

Page 16: Sockets

Programming with sockets… To receive a socket file descriptor

for an incoming connection, you accept() the incoming connection. int accept(int sockfd, struct sockaddr

*addr, socklen_t *addrlen);

addr: The address of the system connect()ing to your system is written to the struct you pass in.

Page 17: Sockets

Programming with sockets… To receive a socket file descriptor for an

incoming connection, you accept() the incoming connection. int accept(int sockfd, struct sockaddr

*addr, socklen_t *addrlen);

Return value: A new socket file descriptor to communicate with the remote system. Your original socket is still listening and more connections can be accept()’d.

Page 18: Sockets

Programming with sockets… If you’ve created a socket that you

want to connect() rather than listen(), you simply create the socket and connect(). int connect(int sockfd, const struct

sockaddr *serv_addr, socklen_t addrlen);

(If you’re connect()’ing, you won’t want to listen() or bind() on that socket.)

Page 19: Sockets

A Simple Client-Server Program

bind()

listen()

accept()

read()

write()

close()

write()

read()

connect()

socket()

socket()

close()

Client

Server

Page 20: Sockets

A Simple Client-Server Program In the diagram:

read() write() close()

…you’ll notice you’ve seen these calls before. These file I/O calls are socket I/O calls, too.

Page 21: Sockets

Programming with sockets… There are a few calls that are socket

specific… ssize_t send(int socket, const void

*buffer, size_t length, int flags);

flags: Provides access to socket-specific parameters. A call to write() is equivalent to send() with no flags (eg: flags == 0).

Page 22: Sockets

Programming with sockets… For completeness, there are a

whole set of send()/recv() calls: send(), sendto(), sendmsg() recv(), recvfrom(), recvmsg()

(In CS 241, we won’t need any of the flag parameters.)

Page 23: Sockets

Server Initialization

OS

1. socket()

Web Server

2. bind(80)3. listen()

80

Listenqueue

Page 24: Sockets

Connecting to the Server

OS

1. socket()

Web Server

2. bind(80)3. listen()

80

Listenqueue

Client

connect()

Requestfrom (IP, port)

Page 25: Sockets

Busy Server Operation

OS

Web Server

80

Listenqueue

Client 1 Client 3Client 2

Client requests get queued-up in the listen queue First-come first-served

Page 26: Sockets

The accept() Call

OS

Web Server

80

Listenqueue

Client 1 Client 3Client 2

Client requests get queued-up in the listen queue First-come first-served

accept()Connectedsocket

Page 27: Sockets

A final note... You now know the calls to use

sockets, but you’ll find you need one more set of calls…

Page 28: Sockets

A final note... Various different architectures store

16-bit and 32-bit numbers differently (big-endian v. little-endian).

When configuring port numbers and IP addresses, we need to talk in an architecture-independent way.

Page 29: Sockets

A final note... In C, functions are provided to

convert between your local architecture and network architecture. htonl(): Converts a long from host to

network byte order. htons(): Converts a short from host to

network byte order. …and the inverse: ntohl() and ntohs().

Page 30: Sockets

A final note... You’ll often find code:

ip.offset = ntohs(ip.offset);ip.length = ntohs(ip.length);ip.id = ntohs(ip.id);

Page 31: Sockets

Speaking of code... We’ll take a look at actual C code

to run a client/server in section tomorrow. Tomorrow will be the very last section

of CS 241 (next Thursday is reading week).

Page 32: Sockets

CS 241 At this point, we’ve covered every topic

in CS 241! Congratulations!

Remember: Prof. Caccamo will be back on Monday HW #2: Due IN-CLASS @11:00am Monday

Solutions will be discussed during Monday’s lecture MP #7: Due on SVN on Wednesday Final Exam: Dec. 18th @8:00am