0% found this document useful (0 votes)
65 views

Practical Socket C

The document discusses TCP/IP sockets and how computers communicate over the internet. It begins by explaining key concepts like IP addresses, ports, sockets and transport protocols. It then describes how TCP client-server interactions work, with the server listening for connections and the client initiating them. The document provides code examples for creating sockets, binding ports, accepting connections, sending and receiving data, and closing connections. It also discusses constructing messages with primitive data types and composed structures.

Uploaded by

wloch
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
65 views

Practical Socket C

The document discusses TCP/IP sockets and how computers communicate over the internet. It begins by explaining key concepts like IP addresses, ports, sockets and transport protocols. It then describes how TCP client-server interactions work, with the server listening for connections and the client initiating them. The document provides code examples for creating sockets, binding ports, accepting connections, sending and receiving data, and closing connections. It also discusses constructing messages with primitive data types and composed structures.

Uploaded by

wloch
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 33

TCP/IP Sockets in C: Practical Guide for Programmers

Michael J. Donahoo Kenneth L. Calvert

Computer Chat

How do we make computers talk?

How are they interconnected?


Internet Protocol (IP)

Internet Protocol (IP)


Datagram (packet) protocol Best-effort service


Loss Reordering Duplication Delay

Host-to-host delivery (not application-to-application)

IP Address

32-bit identifier Dotted-quad: 192.118.56.25 www.mkp.com -> 167.208.101.28 Identifies a host interface (not a host)

192.18.22.13

209.134.16.123

Transport Protocols
Best-effort not sufficient!

Add services on top of IP User Datagram Protocol (UDP)


Data checksum Best-effort Data checksum Reliable byte-stream delivery Flow and congestion control

Transmission Control Protocol (TCP)


Ports
Identifying the ultimate destination

IP addresses identify hosts Host has many applications Ports (16-bit identifier)
Application Port WWW 80 E-mail 25 Telnet 23

192.18.22.13

Socket
How does one speak TCP/IP?

Sockets provides interface to TCP/IP Generic interface for many protocols

Sockets

Identified by protocol and local/remote address/port Applications may refer to many sockets Sockets accessed by many applications

TCP/IP Sockets

mySock = socket(family, type, protocol); TCP/IP-specific sockets


Family Type SOCK_STREAM SOCK_DGRAM Protocol IPPROTO_TCP IPPROTO_UDP PF_INET

TCP UDP

Socket reference

File (socket) descriptor in UNIX Socket handle in WinSock

struct sockaddr { unsigned short sa_family; /* Address family (e.g., AF_INET) */ char sa_data[14]; /* Protocol-specific address information */ }; struct sockaddr_in { unsigned short sin_family;/* Internet protocol (AF_INET) */ unsigned short sin_port; /* Port (16-bits) */ struct in_addr sin_addr; /* Internet address (32-bits) */ char sin_zero[8]; /* Not used */ }; struct in_addr { unsigned long s_addr; /* Internet address (32-bits) */ };

Generic

IP Specific

sockaddr

Family 2 bytes 2 bytes Port 4 bytes Internet address

Blob 8 bytes Not used

sockaddr_in

Family

Clients and Servers


Client: Initiates the connection


Client: Bob Hi. Im Bob. Hi, Bob. Im Jane Server: Jane

Nice to meet you, Jane.


Server: Passively waits to respond

TCP Client/Server Interaction


Server starts by getting ready to receive client connections
Server Create a TCP socket Assign a port to socket Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

TCP Client/Server Interaction


/* Create socket for incoming connections */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);/* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Local port */ if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("bind() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


/* Mark the socket so it will listen for incoming connections */ if (listen(servSock, MAXPENDING) < 0) DieWithError("listen() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


for (;;) /* Run forever */ { clntLen = sizeof(echoClntAddr); if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen)) < 0) DieWithError("accept() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


Server is now blocked waiting for connection from a client Later, a client decides to talk to the server
1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


/* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("connect() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen)) < 0) DieWithError("accept() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


echoStringLen = strlen(echoString); /* Determine input length */ /* Send the string to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


/* Receive message from client */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed");

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Client/Server Interaction


close(sock); close(clntSocket)

1. 2. 3. 4.

Client Create a TCP socket Establish connection Communicate Close the connection

1. 2. 3. 4.

Server Create a TCP socket Bind socket to a port Set socket to listen Repeatedly: a. Accept new connection b. Communicate c. Close the connection

TCP Tidbits

Client must know the servers address and port Server only needs to know its own port No correlation between send() and recv()
send(Hello Bob)

Client Server
recv() -> Hello recv() -> Bob send(Hi ) send(Jane)

recv() -> Hi Jane

Closing a Connection

close() used to delimit communication Analogous to EOF

Echo Client
send(string) while (not received entire string) recv(buffer) print(buffer) close(socket)

Echo Server
recv(buffer) while(client has not closed connection) send(buffer) recv(buffer)

close(client socket)

Constructing Messages
beyond simple strings

TCP/IP Byte Transport


TCP/IP protocols transports bytes


Application
byte stream Here are some bytes. I dont know what they mean.

Application
byte stream Ill pass these to the app. It knows what to do.

TCP/IP

TCP/IP

Application protocol provides semantics

Application Protocol

Encode information in bytes Sender and receiver must agree on semantics Data encoding

Primitive types: strings, integers, and etc. Composed types: message with fields

Primitive Types

String

Character encoding: ASCII, Unicode, UTF Delimit: length vs. termination character
77 M 0 o 111 111 0 m 109 109 0 \n 10

77

Primitive Types

Integer

Strings of character encoded decimal digits


55 7

49 1

57 9

57 9 1. 2. 1. 2.

56 8

55 7

48 0

10 \n

Advantage: Disadvantage:

Human readable Arbitrary size Inefficient Arithmetic manipulation

Primitive Types

Integer

Native representation
0 0 92 246 23,798 4-byte twos-complement integer

Little-Endian

Big-Endian

246

92

Network byte order (Big-Endian)


Use for multi-byte, binary data exchange htonl(), htons(), ntohl(), ntohs()

Message Composition

Message composed of fields


Fixed-length fields integer short short

Variable-length fields i k e 1 2 \n

Beware the bytes of padding -- Julius Caesar, Shakespeare


Architecture alignment restrictions Compiler pads structs to accommodate

struct tst { short x; int y; short z; };


[pad]

[pad]

Problem: Alignment restrictions vary Solution: 1) Rearrange struct members 2) Serialize struct by-member

You might also like