Socket programming in c
This presentation is the property of its rightful owner.
Sponsored Links
1 / 39

Socket Programming in C PowerPoint PPT Presentation

  • Uploaded on
  • Presentation posted in: General

Socket Programming in C. Slides Adapted on J örn Altmann ‘ s Slides. Questions 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?

Download Presentation

Socket Programming in C

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript

Socket programming in c

Socket Programming in C

Slides Adapted on

Jörn Altmann‘s Slides

Questions that will be addressed

Questions 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



Socket programming table of contents

Socket ProgrammingTable of Contents

  • Network Application Programming Interface: Sockets and Internet Sockets

  • Network Programming Tips

  • Client-Server Architecture

  • Example: Client Programming

  • Example: Server Programming

  • Network Programmer’s Mistakes

Layers of the ip protocol suite

e.g. ftp

Application Layer

e.g. TCP, UDP

Transport Layer

e.g. IP

Network Layer


Link Layer

Layers of the IP Protocol Suite

Application Layer

Transport Layer

Network Layer

Link Layer

Protocol suite location


Applications(e.g. browser, game, ftp)

Application ProgrammingInterface (API)(e.g. network API)

Operating System(e.g. Unix)

Interface to the Network Card

Network Card &

Device Driver(e.g. Ethernet card)

Protocol Suite Location

  • Internet Protocol Layer

Application Layer

Transport Layer (TCP, UDP)

Network Layer (IP)

Link Layer

Network api

Network 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



  • 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

Internet sockets

Internet 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

Types of internet sockets

Types 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

Network programming tips

Network Programming Tips

  • Byte Ordering

  • Naming

  • Addressing

Byte ordering of integers

memoryaddress A +1

memoryaddress A

Stored at little-endian computer

high-order byte

low-order byte

low-order byte

high-order byte

Stored at big-endian computer

Byte Ordering of Integers

  • Different CPU architectures have different byte ordering

Integer representation (2 byte)



Byte ordering problem

Message is: [Hello,256]



Message in Memory ofof big-endian Computer

Message in Memory oflittle-endian Computer

Message is sent

across Network

48 45 4C 4C 6F 01 00

48 45 4C 4C 6F 01 00

Byte 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]

Byte ordering solution

Byte 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

Network programming tips1

Network Programming Tips

  • Byte Ordering

  • Naming

  • Addressing

Naming and addressing

Naming and Addressing

  • Host name

    • identifies a single host (see Domain Name System slides)

    • variable length string (e.g.

    • is mapped to one or more IP addresses

  • IP Address

    • written as dotted octets (e.g.

    • 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

Client server architecture

Client-Server Architecture

  • Client requests service from server

  • Server responds with sending service or error message to client





Simple client server example

Simple Client-Server Example








Data request

Data response

End-of-file notification

Example client programming

Example: 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())

Socket initializing socket

socket(): Initializing Socket

  • Getting the file descriptor

    int chat_sock;

    if ((chat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {


    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.

Ip address data structure

IP AddressData Structure

struct sockaddr_in {

short intsin_family; // Address family

unsigned short intsin_port; // Port number

struct in_addr sin_addr; // Internet address

unsigned char sin_zero[8];


struct in_addr {

unsigned long s_addr; // 4 bytes


  • Padding of sin_zeros:struct sockaddr_inhas same size asstruct sockaddr

Connect making tcp connection to server

connect(): Making TCP Connection to Server

struct sockaddr_in sin;

struct hostent *host = gethostbyname (argv[1]);

unsigned int server_address = *(unsigned long *) host->h_addr_list[0];

unsigned short server_port = atoi (argv[2]);

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)) < 0) {


printf("Cannot connect to server\n");



Send sending packets

send(): Sending Packets

int send_packets(char *buffer, int buffer_len) {

sent_bytes = send(chat_sock, buffer, buffer_len, 0);

if (send_bytes < 0) {

perror (“send");


return 0;


  • Needs socket descriptor,

  • Buffer containing the message, and

  • Length of the message

  • Can also use write()

Receiving packets separating data in a stream

Receiving Packets:Separating Data in a Stream

  • Use records (data structures) to partition the data stream

Fixed length record

Fixed length record















slide through

receive buffer

Receiving packets

Receiving 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 < 0) {

perror (“recv");


if (received <= 0) {

return close_connection();


*bytes_read += received;

while (*bytes_read > RECORD_LEN) {

process_packet(buffer, RECORD_LEN);

*bytes_read -= RECORD_LEN;

memmove(buffer, buffer + RECORD_LEN, *bytes_read);


return 0;





Can also use read()

Server programming simple

Server 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() )

Bind assign ip and port

bind(): Assign IP and Port

struct sockaddr_in sin;

struct hostent *host = gethostbyname (argv[1]);

unsigned int server_address = *(unsigned long *) host->h_addr_list[0];

unsigned short server_port = atoi (argv[2]);

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)) < 0) {


printf("Cannot bind server application to network\n");



Socket programming in c


  • bind() tells the OS toassign 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 mayassign 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

Listen wait for connections

listen(): 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.

Server example

Server 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");



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

Socket programming in c

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {




if (listen(sockfd, BACKLOG) == -1) {




while(1) { // main accept() loop

sin_size = sizeof(struct sockaddr_in);

if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {




printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));

if (send(new_fd, "Hello, world!\n", 14, 0) == -1)




return 0;


Client example

Client Example

#include <netinet/in.h>

#include <sys/socket.h>

#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 buf[MAXDATASIZE];

struct hostent *he;

struct sockaddr_in their_addr;// server's address information

if (argc != 2) {

fprintf(stderr,"usage: client hostname\n");



if ((he=gethostbyname(argv[1])) == NULL) { // get the host info




if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {




Socket programming in c

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->h_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){




if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {




buf[numbytes] = '\0';

printf("Received: %s",buf);


return 0;


I o blocking

I/O Blocking


bind() ;




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.

Select i o multiplexing

select() :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

    • doesnot scale to large number of file descriptors

Example server programming

Example: 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() )

Server alternative ways of handling many clients

Server: 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.

Network programmer s mistakes

Network Programmer’s Mistakes

  • byte ordering

  • separating records in streams

  • use of select()

  • misinterpreting the project specification

  • not knowing all available system calls

There are more system calls

There 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



  • short tutorial:Beej's Guide to Network Programming

  • 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

  • Login