ELEN 602: Computer Communications and Networking. Socket Programming Basics



Similar documents
Socket Programming. Request. Reply. Figure 1. Client-Server paradigm

Socket Programming. Kameswari Chebrolu Dept. of Electrical Engineering, IIT Kanpur

Unix Network Programming

Socket Programming. Srinidhi Varadarajan

The POSIX Socket API

Tutorial on Socket Programming

Socket Programming in C/C++

Introduction to Socket Programming Part I : TCP Clients, Servers; Host information

ICT SEcurity BASICS. Course: Software Defined Radio. Angelo Liguori. SP4TE lab.

Network Programming with Sockets. Process Management in UNIX

TCP/IP - Socket Programming

Implementing Network Software

Computer Networks Network architecture

Programmation Systèmes Cours 9 UNIX Domain Sockets

Networks. Inter-process Communication. Pipes. Inter-process Communication

Operating Systems Design 16. Networking: Sockets

Limi Kalita / (IJCSIT) International Journal of Computer Science and Information Technologies, Vol. 5 (3), 2014, Socket Programming

Lab 4: Socket Programming: netcat part

Introduction to Socket programming using C

UNIX Sockets. COS 461 Precept 1

INTRODUCTION UNIX NETWORK PROGRAMMING Vol 1, Third Edition by Richard Stevens

Session NM059. TCP/IP Programming on VMS. Geoff Bryant Process Software

NS3 Lab 1 TCP/IP Network Programming in C

IT304 Experiment 2 To understand the concept of IPC, Pipes, Signals, Multi-Threading and Multiprocessing in the context of networking.

Communication Networks. Introduction & Socket Programming Yuval Rochman

VMCI Sockets Programming Guide VMware ESX/ESXi 4.x VMware Workstation 7.x VMware Server 2.0

Generalised Socket Addresses for Unix Squeak

Porting applications & DNS issues. socket interface extensions for IPv6. Eva M. Castro. ecastro@dit.upm.es. dit. Porting applications & DNS issues UPM

Packet Sniffing and Spoofing Lab

Objectives of Lecture. Network Architecture. Protocols. Contents

BSD Sockets Interface Programmer s Guide

Computer Networks/DV2 Lab

Network Programming TDC 561

Overview. Socket Programming. Using Ports to Identify Services. UNIX Socket API. Knowing What Port Number To Use. Socket: End Point of Communication

Programming with TCP/IP Best Practices

Socket = an interface connection between two (dissimilar) pipes. OS provides this API to connect applications to networks. home.comcast.

DESIGN AND IMPLEMENT AND ONLINE EXERCISE FOR TEACHING AND DEVELOPMENT OF A SERVER USING SOCKET PROGRAMMING IN C

What is CSG150 about? Fundamentals of Computer Networking. Course Outline. Lecture 1 Outline. Guevara Noubir noubir@ccs.neu.

Application Architecture

Basic Networking Concepts. 1. Introduction 2. Protocols 3. Protocol Layers 4. Network Interconnection/Internet

Writing Client/Server Programs in C Using Sockets (A Tutorial) Part I. Session Greg Granger grgran@sas. sas.com. SAS/C & C++ Support

Chapter 11. User Datagram Protocol (UDP)

Implementing and testing tftp

System calls. Problem: How to access resources other than CPU

University of Amsterdam

Chapter 3. Internet Applications and Network Programming

sys socketcall: Network systems calls on Linux

Ethernet. Ethernet. Network Devices

Networks class CS144 Introduction to Computer Networking Goal: Teach the concepts underlying networks Prerequisites:

Network Programming using sockets

SMTP-32 Library. Simple Mail Transfer Protocol Dynamic Link Library for Microsoft Windows. Version 5.2

First Workshop on Open Source and Internet Technology for Scientific Environment: with case studies from Environmental Monitoring

Socket programming. Socket Programming. Languages and Platforms. Sockets. Rohan Murty Hitesh Ballani. Last Modified: 2/8/2004 8:30:45 AM

Introduction to Computer Networks

Network-Oriented Software Development. Course: CSc4360/CSc6360 Instructor: Dr. Beyah Sessions: M-W, 3:00 4:40pm Lecture 2

CPS221 Lecture: Layered Network Architecture

Abhijit A. Sawant, Dr. B. B. Meshram Department of Computer Technology, Veermata Jijabai Technological Institute

Network Programming. Chapter The Client-Server Programming Model

TCP Session Management (SesM) Protocol Specification

Application Note: AN00121 Using XMOS TCP/IP Library for UDP-based Networking

Transport Layer Protocols

q Connection establishment (if connection-oriented) q Data transfer q Connection release (if conn-oriented) q Addressing the transport user

SSC - Communication and Networking Java Socket Programming (II)

Transport Layer. Chapter 3.4. Think about

Dissertation Title: SOCKS5-based Firewall Support For UDP-based Application. Author: Fung, King Pong

Computer Networks UDP and TCP

Data Communication & Networks G

Chapter 5. Transport layer protocols

IP Network Layer. Datagram ID FLAG Fragment Offset. IP Datagrams. IP Addresses. IP Addresses. CSCE 515: Computer Network Programming TCP/IP

Internet Concepts. What is a Network?

The TCP/IP Reference Model

Overview - Using ADAMS With a Firewall

Overview - Using ADAMS With a Firewall

How do I get to

Chapter 2: Remote Procedure Call (RPC)

Computer Networks - Xarxes de Computadors

transmission media and network topologies client/server architecture layers, protocols, and sockets

This tutorial has been designed for everyone interested in learning the data exchange features of Unix Sockets.

Overview. Securing TCP/IP. Introduction to TCP/IP (cont d) Introduction to TCP/IP

Direct Sockets. Christian Leber Lehrstuhl Rechnerarchitektur Universität Mannheim

UNIX. Sockets. mgr inż. Marcin Borkowski

Java Network. Slides prepared by : Farzana Rahman

Application Development with TCP/IP. Brian S. Mitchell Drexel University

Application Layer. CMPT Application Layer 1. Required Reading: Chapter 2 of the text book. Outline of Chapter 2

Computer Networks Practicum 2015

TFTP Usage and Design. Diskless Workstation Booting 1. TFTP Usage and Design (cont.) CSCE 515: Computer Network Programming TFTP + Errors

ICOM : Computer Networks Chapter 6: The Transport Layer. By Dr Yi Qian Department of Electronic and Computer Engineering Fall 2006 UPRM

Note! The problem set consists of two parts: Part I: The problem specifications pages Part II: The answer pages

The exam has 110 possible points, 10 of which are extra credit. There is a Word Bank on Page 8. Pages 7-8 can be removed from the exam.

A Client Server Transaction. Introduction to Computer Systems /18 243, fall th Lecture, Nov. 3 rd

The OSI model has seven layers. The principles that were applied to arrive at the seven layers can be briefly summarized as follows:

Why SSL is better than IPsec for Fully Transparent Mobile Network Access

IP Addressing. -Internetworking (with TCP/IP) -Classful addressing -Subnetting and Supernetting -Classless addressing

Transcription:

1 ELEN 602: Computer Communications and Networking Socket Programming Basics A. Introduction In the classic client-server model, the client sends out requests to the server, and the server does some processing with the request(s) received, and returns a reply (or replies) to the client. The terms request and reply here may take on different meanings depending upon the context, and method of operation. An example of a simple and ubiquitous client-server application would be that of a web-server. A client (Internet Explorer, or Netscape) sends out a request for a particular web page, and the web-server (which may be geographically distant, often in a different continent!) receives and processes this request, and sends out a reply, which in this case, is the web page that was requested. The web page is then displayed on the browser (client). Fig. 1. Client-Server Paradigm Further, servers may be broadly classified into two types based on the way they serve requests from clients. Iterative Servers can serve only one client at a time. If two or more clients send in their requests at the same time, one of them has to wait until the other client has received service. On the other hand, Concurrent Servers

2 can serve multiple clients at the same time. Typically, this is done by spawning off a new server process on the receipt of a request - the original process goes back to listening to new connections, and the newly spawned off process serves the request received. We can realize the client-server communication described above with a set of network protocols, like the TCP/IP protocol suite, for instance. In this tutorial, we will look at the issue of developing applications for realizing such communication over a network. In order to write such applications, we need to understand sockets. B. What are sockets? Sockets (also called Berkeley Sockets, owing to their origin) can simply be defined as end-points for communication. To provide a rather crude visualization, we could imagine the client and server hosts in Figure 1 being connected by a pipe through which data-flow takes place, and each end of the pipe can now be construed as an end-point. Thus, a socket provides us with an abstraction, or a logical end point for communication. There are different types of sockets. Stream Sockets, of type SOCK STREAM are used for connection oriented, TCP connections, whereas Datagram Sockets of type SOCK DGRAM are used for UDP based applications. Apart from these two, other socket types like SOCK RAW and SOCK SEQPACKET are also defined. C. Socket layer, and the Berkeley Socket API Figure 2 shows the TCP/IP protocol stack, and shows where the Socket layer may be placed in the stack. Again, please be advised that this is just a representation to indicate the level at which we operate when we write network programs using

3 sockets. As shown in the figure, sockets make use of the lower level network protocols, and provide the application developer with an interface to the lower level network protocols. A library of system calls are provided by the socket layer, and are termed as the Socket API. These system calls can be used in writing socket programs. In the sections that follow, we will study these system calls in detail. We shall study socket programming in the UNIX environment. Fig. 2. TCP/IP Protocol Stack.

4 D. Basic Socket system calls Figure 3 shows the sequence of system calls between a client and server for a connectionoriented protocol. Let us take a detailed look at some of the socket system calls: Fig. 3. Socket system calls for connection-oriented case.

5 socket() system call syntax: 1. The socket() system call int sd = socket (int domain, int type, int protocol); The socket() system call creates a socket and returns a socket file descriptor to the socket created. The descriptor is of data type int. Here, domain is the address family specification, type is the socket type and the protocol field is used to specify the protocol to be used with the address family specified. The address family can be one of AF INET (for Internet protocols like TCP, UDP, which is what we are going to use) or AF UNIX (for Unix internal protocols), AF NS, for Xerox network protocols or AF IMPLINK for the IMP link layer. (The type field is the socket type - which may be SOCK STREAM for stream sockets (TCP connections), or SOCK DGRAM (for datagram connections). Other socket types are defined too. SOCK RAW is used for raw sockets, and SOCK SEQPACKET is used for a sequenced packet socket. The protocol argument is typically set to 0. You may also specify a protocol argument to use a specific protocol for your application. 2. The bind() system call The bind() system call is used to specify the association <Local-Address, Local-Port>. It is used to bind either connection oriented or connectionless sockets. The bind() function basically associates a name to an unnamed socket. Name, here refers to three components - The address family, the host address, and the port number at which the application will provide its service. The syntax and arguments taken by the bind system call is given below: int result = bind(int sd, struct sockaddr *address, int addrlen);

6 Here, sd is the socket file descriptor returned by the socket() system call before, and name points to the sockaddr structure, and addrlen is the size of the sockaddr structure. Like all other socket system calls, upon success, bind() returns 0. In case of error, bind() returns -1. 3. The listen() system call After creation of the socket, and binding to a local port, the server has to wait on incoming connection requests. The listen() system call is used to specify the queue or backlog of waiting (or incomplete) connections. The syntax and arguments taken by the listen() system call is given below: int result = listen(int sd, int backlog); Here, sd is the socket file descriptor returned by the socket() system call before, and backlog is the number of incoming connections that can be queued. Upon success, listen() returns 0. In case of error, listen() returns -1. 4. The accept() system call After executing the listen() system call, a server waits for incoming connections. An actual connection setup is completed by a call to accept(). accept() takes the first connection request on the queue, and creates another socket descriptor with the same properties as sd (the socket descriptor returned earlier by the socket() system call). The new socket descriptor handles communications with the new client while the earlier socket descriptor goes back to listening for new connections. In a sense, the accept() system call completes the connection, and at the end of a successful accept(), all elements of the four tuple (or the five tuple - if you consider protocol

7 as one of the elements) of a connection are filled. The four-tuple that we talk about here is <Local Addr, Local Port, Remote Addr, Remote Port>. This combination of fields is used to uniquely identify a flow or a connection. The fifth tuple element can be the protocol field. No two connections can have the same values for all the four (or five) fields of the tuple. accept() syntax: int newsd = accept(int sd, void *addr, int *addrlen); Here, sd is the socket file descriptor returned by the socket() system call before, and addr is a pointer to a structure that receives the address of the connecting entity, and addrlen is the length of that structure. Upon success, accept() returns a socket file descriptor to the new socket created. In case of error, accept() returns -1. 5. The connect() system call A client process also starts out by creating a socket by calling the socket() system call. It uses connect() to connect that socket descriptor to establish a connection with a server. In the case of a connection oriented protocol (like TCP/IP), the connect() system call results in the actual connection establishment of a connection between the two hosts. In case of TCP, following this call, the three-way handshake to establish a connection is completed. Note that the client does not necessarily have to bind to a local port in order to call connect(). Clients typically choose ephemeral port numbers for their end of the connection. Servers, on the other hand, have to provide service on well-known (premeditated) port numbers. connect() syntax: int result = connect(int sd, struct sockaddr *servaddr, int addrlen); Here, sd is the socket file descriptor returned by the socket() system call be-

8 fore, servaddr is a pointer to the server s address structure (port number and IP address). addrlen holds the length of this parameter and can be set to sizeof(struct sockaddr). Upon success, connect() returns 0. In case of error, connect() returns -1. 6. The send(), recv(), sendto() and recvfrom() system calls After connection establishment, data is exchanged between the server and client using the system calls send(), recv(), sendto() and recvfrom(). The syntax of the system calls are as below: int nbytes = send(int sd, const void *buf, int len, int flags); int nbytes = recv(int sd, void *buf, int len, unsigned int flags); int nbytes = sendto(int sd, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen); int nbytes = recvfrom(int sd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); Here, sd is the socket file descriptor returned by the socket() system call before, buf is the buffer to be sent or received, flags is the indicator specifying the way the call is to be made (usually set to 0). sendto() and recvfrom() are used in case of connectionless sockets, and they do the same function as send() and recv() except that they take more arguments (the to and from addresses - as the socket is connectionless) Upon success, all these calls return the number of bytes written or read. Upon failure, all the above calls return -1. recv() returns 0 if the connection was closed by the remote side.

9 7. The close() system call The close() system call is used to close the connection. In some cases, any remaining data that is queued is sent out before the close() is executed. The close() system call prevents further reads or writes to the socket. close() syntax: int result = close (int sd); Here, sd is the socket file descriptor returned by the socket() system call before. 8. The shutdown() system call The shutdown() system call is used to disable sends or receives on a socket. shutdown() syntax: int result = shutdown (int sd, int how); Here, sd is the socket file descriptor returned by the socket() system call before. The parameter how determines how the shutdown is achieved. If the value of the parameter how is 0, further receives on the socket will be disallowed. If how is 1, further sends are disallowed, and finally, if how is 2, both sends and receives on the socket are disallowed. Remember that the shutdown() function does not close the socket. The socket is closed and all the associated resources are freed only after a close() system call. Upon success, shutdown() returns 0. In case of error, shutdown() returns -1. E. Byte ordering, and byte ordering routines When data is transmitted on networks, the byte ordering of data becomes an issue. There are predominantly two kinds of byte orderings - Network Byte Order (Big- Endian byte order) and Host Byte Order (Little-Endian byte order). The network byte order has the most significant byte first, while the host byte order has the least

10 significant byte first. Different processor architectures use different kinds of byte orderings. Data transmitted on a network is sent in the network byte order. Hence, because of disparities among different machines, when data needs to be transmitted over a network, we need to change the byte ordering to the network byte order. The following routines help in changing the byte order of the data: u short result = ntohs (u short netshort); u short result = htons (u short hostshort); u long result = ntohl (u long netlong); u long result = htonl (u long hostlong); The hton* routines convert host-byte-order to the network-byte-order. The ntoh* routines do the opposite. F. Important structs This section has definitions for the structs used in the socket system calls. struct sockaddr { unsigned short sa family; // address family, AF xxx char sa data [14]; // 14 bytes of protocol address }; The sockaddr structure holds the socket address information for all types of sockets. The sa family field can point to many address families. The Internet address family is denoted by AF INET, and that encompasses most of the popular protocols we use (TCP/UDP), and so the Internet address specific parallel sockaddr structure is called sockaddr in. The fields are self-explanatory. The sin zero field serves as padding, and is typically set to all zeroes using memset().

11 struct sockaddr in { short int unsigned short int struct in addr unsigned char sin family; sin port; sin addr; sin zero[8]; };