Title: Socket Programming in C
1Socket Programming in C
- Slides Adapted on
- Jörn Altmanns Slides
2Questions that will be Addressed
- What mechanisms are available for a programmer
who writes network applications? - How to write a network application that sends
packets between hosts (client and server) across
an IP network? - Answer socket API
IP Network
Client
Server
3Socket ProgrammingTable of Contents
- Network Application Programming Interface
Sockets and Internet Sockets - Network Programming Tips
- Client-Server Architecture
- Example Client Programming
- Example Server Programming
- Network Programmers Mistakes
4Layers of the IP Protocol Suite
Application Layer
Transport Layer
Network Layer
Link Layer
5Protocol Suite Location
Application Layer
Transport Layer (TCP, UDP)
Network Layer (IP)
Link Layer
6Network API
- Operating system provides Application Programming
Interface (API) for network application - API is defined by a set of function types, data
structures, and constants - Desirable characteristics of the network
interface - Simple to use
- Flexible
- independent from any application
- allows program to use all functionality of the
network - Standardized
- allows programmer to learn once, write anywhere
- Application Programming Interface for networks is
called socket
7Sockets
- Sockets provide mechanisms to communicate between
computers across a network - There are different kind of sockets
- DARPA Internet addresses (Internet Sockets)
- Unix interprocess communication (Unix Sockets)
- CCITT X.25 addresses
- and many others
- Berkeley sockets is the most popular Internet
Socket - runs on Linux, FreeBSD, OS X, Windows
- fed by the popularity of TCP/IP
8Internet Sockets
- Support stream and datagram packets (e.g. TCP,
UDP, IP) - Is Similar to UNIX file I/O API (provides a file
descriptor) - Based on C, single thread model
- does not require multiple threads
9Types of Internet Sockets
- Different types of sockets implement different
communication types (stream vs. datagram) - Type of socket stream socket
- connection-oriented
- two way communication
- reliable (error free), in order delivery
- can use the Transmission Control Protocol (TCP)
- e.g. telnet, ssh, http
- Type of socket datagram socket
- connectionless, does not maintain an open
connection, each packet is independent - can use the User Datagram Protocol (UDP)
- e.g. IP telephony
- Other types exist similar to the one above
10Network Programming Tips
- Byte Ordering
- Naming
- Addressing
11Byte Ordering of Integers
- Different CPU architectures have different byte
ordering
D3
F2
Integer representation (2 byte)
12Byte Ordering Problem
- Question What would happen if two computers with
different integer byte ordering communicate?
- Answer
- Nothing if they do not exchange integers!
- But If they exchange integers, they would get
the wrong order of bytes, therefore, the wrong
value! - Example
Message is Hello,1
13Byte Ordering Solution
- There are two solutions if computers with
different byte ordering system want to
communicate - They must know the kind of architecture of the
sending computer(bad solution, it has not been
implemented) - Introduction of a network byte order. The
functions are - uint16_t htons(uint16_t host16bitvalue)
- uint32_t htonl(uint32_t host32bitvalue)
- uint16_t ntohs(uint16_t net16bitvalue)
- uint32_t ntohs(uint32_t net32bitvalue)
- Note use for all integers (short and long),
which are sent across the network - Including port numbers and IP addresses
14Network Programming Tips
- Byte Ordering
- Naming
- Addressing
15Naming and Addressing
- Host name
- identifies a single host (see Domain Name System
slides) - variable length string (e.g. www.berkeley.edu)
- is mapped to one or more IP addresses
- IP Address
- written as dotted octets (e.g. 10.0.0.1)
- 32 bits. Not a number! But often needs to be
converted to a 32-bit to use. - Port number
- identifies a process on a host
- 16 bit number
16Client-Server Architecture
response
Client
Server
request
- Client requests service from server
- Server responds with sending service or error
message to client
17Simple Client-Server Example
response
Client
Server
request
socket()connect()send()recv()close()
socket()bind()listen()accept()recv()send()
recv()close()
Connectionestablishment
Data request
Data response
End-of-file notification
18Example Client Programming
- Create stream socket (socket() )
- Connect to server (connect() )
- While still connected
- send message to server (send() )
- receive (recv() ) data from server and process it
- Close TCP connection and Socket (close())
19socket() Initializing Socket
- Getting the file descriptor
- int chat_sock
- if ((chat_sock socket(AF_INET, SOCK_STREAM,
0)) lt 0) - perror("socket")
- printf("Failed to create socket\n")
- abort ()
-
- 1.parameter specifies protocol/address family
- 2.parameter specifies the socket type
- Other possibilities SOCK_DGRAM
- 3.parameter specifies the protocol.
- 0 means protocol is chosen by the OS.
20IP Address Data Structure
- struct sockaddr_in
- short int sin_family // Address family
- unsigned short int sin_port // Port number
- struct in_addr sin_addr // Internet address
- unsigned char sin_zero8
-
- struct in_addr
- unsigned long s_addr // 4 bytes
-
- Padding of sin_zeros struct sockaddr_in has same
size as struct sockaddr
21connect() Making TCP Connection to Server
- struct sockaddr_in sin
- struct hostent host gethostbyname (argv1)
- unsigned int server_address (unsigned long )
host-gth_addr_list0 - unsigned short server_port atoi (argv2)
- memset (sin, 0, sizeof (sin))
- sin.sin_family AF_INET
- sin.sin_addr.s_addr server_address
- sin.sin_port htons (server_port)
- if (connect(chat_sock, (struct sockaddr ) sin,
sizeof (sin)) lt 0) - perror("connect")
- printf("Cannot connect to server\n")
- abort()
22send() Sending Packets
- int send_packets(char buffer, int buffer_len)
- sent_bytes send(chat_sock, buffer,
buffer_len, 0) - if (send_bytes lt 0)
- perror (send")
-
- return 0
-
- Needs socket descriptor,
- Buffer containing the message, and
- Length of the message
- Can also use write()
23Receiving PacketsSeparating Data in a Stream
Fixed length record
Fixed length record
A
B
C
D
0
1
3
2
9
4
6
8
7
5
slide through
receive buffer
- Use records (data structures) to partition the
data stream
24Receiving Packets
- int receive_packets(char buffer, int buffer_len,
int bytes_read) -
- int left buffer_len - bytes_read
- received recv(chat_sock, buffer
bytes_read, left, 0) - if (received lt 0)
- perror (recv")
-
- if (received lt 0)
- return close_connection()
-
- bytes_read received
- while (bytes_read gt RECORD_LEN)
- process_packet(buffer, RECORD_LEN)
- bytes_read - RECORD_LEN
- memmove(buffer, buffer RECORD_LEN,
bytes_read) -
- return 0
buffer_len
buffer
bytes_read
25Server Programming Simple
- Create stream socket (socket() )
- Bind port to socket (bind() )
- Listen for new client (listen() )
- While
- accept user connection and create a new socket
(accept() ) - data arrives from client (recv() )
- data has to be send to client (send() )
26bind() Assign IP and Port
- struct sockaddr_in sin
- struct hostent host gethostbyname (argv1)
- unsigned int server_address (unsigned long )
host-gth_addr_list0 - unsigned short server_port atoi (argv2)
- memset (sin, 0, sizeof (sin))
- sin.sin_family AF_INET
- sin.sin_addr.s_addr server_address
- sin.sin_port htons (server_port)
- if (bind(chat_sock, (struct sockaddr ) sin,
sizeof (sin)) lt 0) - perror("bind")
- printf("Cannot bind server application to
network\n") - abort()
27bind()
- bind() tells the OS to assign a local IP address
and local port number to the socket. - Many applications let the OS choose an IP
address. - Use wildcard INADDR_ANY as local address in this
case. - At server, user process must call bind() to
assign a port - At client, bind() is not required since OS may
assign available port and IP address - The server will get the port number of the client
through the UDP/TCP packet header - Note Each application is represented by a server
port number
28listen() Wait for Connections
- int listen(int sockfd, int backlog)
- Puts socket in a listening state, willing to
handle incoming TCP connection request. - Backlog number of TCP connections that can be
queued at the socket.
29Server Example
- define MYPORT 3490 // the port users will be
connecting to - define BACKLOG 10 // how many pending
connections queue will hold - int main(void)
- int sockfd, new_fd // listen on sockfd, new
connection on new_fd - struct sockaddr_in my_addr // my address
information - struct sockaddr_in their_addr // connector's
address information - int sin_size
- if ((sockfd socket(AF_INET, SOCK_STREAM, 0))
-1) perror("socket") - exit(1)
-
- my_addr.sin_family AF_INET // host byte
order - my_addr.sin_port htons(MYPORT) // short,
network byte order - my_addr.sin_addr.s_addr INADDR_ANY // auto.
filled with local IP - memset((my_addr.sin_zero), '\0', 8)
// zero the rest of the struct
30- if (bind(sockfd, (struct sockaddr )my_addr,
sizeof(struct sockaddr)) -1) - perror("bind")
- exit(1)
-
- if (listen(sockfd, BACKLOG) -1)
- perror("listen")
- exit(1)
-
-
- while(1) // main accept() loop
- sin_size sizeof(struct sockaddr_in)
- if ((new_fd accept(sockfd, (struct sockaddr
)their_addr, sin_size)) -1) - perror("accept")
- continue
-
- printf("server got connection from s\n",
inet_ntoa(their_addr.sin_addr))
31Client Example
- include ltnetinet/in.hgt
- include ltsys/socket.hgt
- define PORT 3490 // the port client will be
connecting to - define MAXDATASIZE 100 // max number of
bytes we can get - // at once
- int main(int argc, char argv)
- int sockfd, numbytes
- char bufMAXDATASIZE
- struct hostent he
- struct sockaddr_in their_addr // server's
address information - if (argc ! 2)
- fprintf(stderr,"usage client hostname\n")
- exit(1)
-
- if ((hegethostbyname(argv1)) NULL) //
get the host info - perror("gethostbyname")
32- their_addr.sin_family AF_INET //
host byte order - their_addr.sin_port htons(PORT) //
short, network byte order - their_addr.sin_addr ((struct in_addr
)he-gth_addr) // already network byte order - memset((their_addr.sin_zero), '\0', 8) // zero
the rest of the struct - if (connect(sockfd, (struct sockaddr
)their_addr, sizeof(struct sockaddr)) -1) - perror("connect")
- exit(1)
-
- if ((numbytesrecv(sockfd, buf, MAXDATASIZE-1,
0)) -1) - perror("recv")
- exit(1)
-
-
- bufnumbytes '\0'
- printf("Received s",buf)
- close(sockfd)
- return 0
33I/O Blocking
- socket()
- bind()
- listen()
- while
- accept()
- recv()
- send()
- Simple server has blocking problem
- Suppose 5 connections accepted.
- Suppose next accept() blocks.
- Other connections cannot send and receive.
- Cannot get keyboard input either.
34select() I/O Multiplexing
- waits on multiple file descriptors and timeout
- returns when any file descriptor
- is ready to be read or
- written or
- indicate an error, or
- timeout exceeded
- advantages
- simple
- application does not consume CPU cycles while
waiting - disadvantages
- does not scale to large number of file descriptors
35Example Server Programming
- create stream socket (socket() )
- Bind port to socket (bind() )
- Listen for new client (listen() )
- While
- Wait for (select() )
- (depending on which file descriptors are ready)
- accept user connection and create a new socket
(accept() ) - data arrives from client (recv() )
- data has to be send to client (send() )
36Server Alternative Ways of Handling Many Clients
- Forking a new process for each client fork()
- But, creating new process is expensive.
- Multithreaded implementation have one thread
handling each client. - Thread is like a process but light-weighted.
37Network Programmers Mistakes
- byte ordering
- separating records in streams
- use of select()
- misinterpreting the project specification
- not knowing all available system calls
38There are more System Calls
- Depends on communication type
- Datagram sockets use recvfrom() and sendto() for
receiving and sending data - Closing connection close(), shutdown()
- Convenient functions (on UNIX)
- inet_aton, inet_ntoa
- inet_pton, inet_ntop
39Literature
- short tutorial Beej's Guide to Network
Programming - http//www.ecst.csuchico.edu/beej/guide/net/
- Unix Network Programming, volumes 1 and 2 by W.
Richard Stevens. Published by Prentice Hall
ISBNs for volumes 1 and 2 013490012X,
0130810819. - Advanced Programming in the Unix Environment by
W. Richard Stevens. Published by Addison Wesley.
ISBN 0201563177. - man pages on a Unix computer