Socket Programming
What is a socket?
Using sockets
Types
(Protocols)
Associated functions
Styles
What is a socket?
An interface between application and
network
The application creates a socket
Once configured the application can
pass data to the socket for network
transmission
receive data from the socket
Two essential types of sockets
SOCK_DGRAM
SOCK_STREAM
a.k.a. TCP
reliable delivery
in-order guaranteed
connection-oriented
Bidirectional
Bind(), listen(),accept()
and connect()
App
3 2
1
a.k.a. UDP
unreliable delivery
no order guarantees
Send or receive
D1
App
socket
Dest.
3 2
1
D2
socket
D3
3
Model of Socket
Step 1 : Create a socket
Step 2: connect the socket to the address
of the server
Step 3: send/receive the data
Step 4: close the socket
Model of Socket
Step 1 : Create a socket
Step 2: connect the socket to the address
of the server
Step 3: send/receive the data
Step 4: close the socket
The struct sockaddr
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
The Internet-specific:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_family = AF_INET
sin_port: port # (0-65535)
sin_addr: IP-address
sin_zero: unused
Socket Creation in C: socket
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
A Socket-eye view of the
Internet
medellin.cs.columbia.edu
(128.59.21.14)
newworld.cs.umass.edu
(128.119.245.93)
cluster.cs.columbia.edu
(128.59.21.14, 128.59.16.7,
128.59.16.5, 128.59.16.4)
Each host machine has an IP address
When a packet arrives at a host
8
TYPES OF ADDRESS STRUCTURES
Struct sockaddr
It holds the socket information
Struct in_addr
It holds 32 bit netid/hostid.
Struct sockaddr_in/IPv4 Socket Address
It holds the info about family, port number,
internet address and size of the struct
Struct hostent
Struct servent
Relevant info about host
and ports
Struct sockaddr_in6/IPv6 Socket Address
Struct sockaddr_storage
Its having large enough socket address type
Ports
Each host has 65,536
ports
Some ports are
reserved for specific
apps
20,21: FTP
23: Telnet
80: HTTP
Port 0
Port 1
Port 65535
A socket provides an interface
to send data to/from the
network through a port
10
Address and port byte-ordering
Address and port are stored as
integers
u_short sin_port; (16 bit)
in_addr sin_addr; (32 bit)
struct in_addr {
u_long s_addr;
};
Problem:
different machines / OSs use different word orderings
little-endian: lower bytes first
big-endian: higher bytes first
these machines may communicate with one another over the
network
128.119.40.12
128
Big-Endian
machine
119
40
12
Little-Endian
machine
N
O
R119
W
128
!
!
!
G
40
12.40.119.128
12
11
UNIXs byte-ordering funcs
u_long htonl(u_long x);
u_long ntohl(u_long x);
u_short htons(u_short x);
u_short ntohs(u_short x);
On big-endian machines, these routines do nothing
On little-endian machines, they reverse the byte
order
hto
128
119
40
12
Little-Endian12
machine
128
119
40
128.119.40.12
40
119 128
12
ntohl
nl
128
119 40
128.119.40.12
Big-Endian
12machine
Same code would have worked regardless of endian-
ness of the two machines
12
Address conversion Function
Function converting
IPv4
Inet_aton
it converts address
to number
Inet_ntoa
network address to
number
Inet_addr
internet host
address to number
Function converting
IPv6
Inet_pton
It convert text to
binary
Inet_ntop
It converts IPv4
and IPv6 from
binary to text form
13