Sockets: A Comprehensive Overview

 
W
i
n
3
2
 
S
o
c
k
e
t
s
 
Jim Fawcett
CSE 687-OnLine – Object Oriented Design
Summer 2017
 
R
e
f
e
r
e
n
c
e
s
 
Socket Routines, MSDN help
Network Programming for Microsoft Windows, Jones &
Ohlund, Microsoft Press, 1999 (a later edition is in print)
C# Network Programming, Richard Blum, Sybex, 2003
http://tangentsoft.net/wskfaq
 
W
h
a
t
 
a
r
e
 
S
o
c
k
e
t
s
?
 
Sockets provide a common interface to the various protocols
supported by networks.
They allow you to establish  connections between machines to send
and receive data.
Sockets support the simultaneous connection of multiple clients to a
single server machine.
 
N
e
t
w
o
r
k
 
P
r
o
t
o
c
o
l
s
 
Socket applications can adopt communication styles supported by a
specific underlying protocol, e.g.:
We will focus on sockets using TCP/IP, that is, reliable, packet ordered,
connection-oriented communication with streams.
 
T
C
P
 
P
r
o
t
o
c
o
l
 
TCP/IP stands for "Transmission Control Protocol / Internet Protocol
.
TCP/IP is the most important of several protocols used on the internet. Some others are:
HyperText Transport Protocol (HTTP), File Transfer Protocol (FTP), Simple Mail Transfer
Protocol (SMTP), and Telnet, a protocol for logging into a remote computer. Sockets
provide a standard interface for a variety of network protocols. TCP/IP is, by far, the most
commonly used protocol for sockets. Here are the main features of TCP/IP:
IP is a routable protocol.
That means that TCP/IP messages can be passed between networks in a Wide Area
Network (WAN) cluster.
Each device using TCP/IP must have an IP address
.
This address is a 32 bit word, organized into four 8-bit fields, called octets. Part of the
IP address identifies the network and the rest identifies a specific host on the
network.
IP addresses are organized into three classes
.
Each class has a different allocation of octets to these two identifiers. This allows the
internet to define many networks, each containing up to 256 devices (mostly
computers), and a few networks, each containing many more devices.
A single machine can run mulitple communictaions sessions using TCP/IP.
That is, you can run a web browser while using Telnet and FTP, simultaneously.
 
T
C
P
/
I
P
 
b
a
s
e
d
 
S
o
c
k
e
t
s
 
Connection-oriented means that two communicating machines
must first connect.
All data sent will be received in the same order as sent.
Note that IP packets may arrive in a different order than that sent.
This occurs because all packets in a communication do not necessarily
travel the same route between sender and receiver.
Streams mean that, as far as sockets are concerned, the only
recognized structure is bytes of data.
 
S
o
c
k
e
t
 
L
o
g
i
c
a
l
 
S
t
r
u
c
t
u
r
e
 
C
r
e
a
t
i
n
g
 
S
o
c
k
e
t
s
 
Socket connections are based on:
Domains – network connection or IPC pipe
AF_INET for IPv4 protocol
AF_INET6 for IPv6 protocol
Type – stream, datagram, raw IP packets, …
SOCK_STREAM 
 TCP packets
SOCK_DGRAM 
 UDP packets
Protocol – TCP, UDP, …
0 
 default, e.g., TCP for SOCK_STREAM
Example:
HANDLE sock = socket(AF_INET,SOCK_STREAM,0);
 
C
o
n
n
e
c
t
i
n
g
 
S
o
c
k
e
t
s
 
Socket addresses
struct SOCKADDR_IN {
 
 
sin_family
   
// AF_INET
 
 
sin_address.s_addr 
 
// inet_addr(“127.0.0.1”);
  
 
sin_port 
   
// htons(8000);
} addr;
Bind server listener to port:
int err = bind(sock, (SOCKADDR_IN*)&addr,sizeof(addr));
Connect client to server:
HANDLE connect(sock, (SOCKADDR_IN*)&addr,sizeof(addr))
 
C
l
i
e
n
t
 
/
 
S
e
r
v
e
r
 
P
r
o
c
e
s
s
i
n
g
 
A
c
c
e
s
s
i
n
g
 
S
o
c
k
e
t
s
 
L
i
b
r
a
r
y
 
#include <winsock2.h>
Link with wsock32.lib
To build a server for multiple clients you will need to use threads, e.g.:
  
#include <process.h> // Win32 threads
     or
 #include<threads>
 
 // C++11 threads
and use the Project Settings:
  
C/C++ language\category=code generation\debug multithreaded
 
P
r
o
j
e
c
t
 
S
e
t
t
i
n
g
s
 
P
r
o
j
e
c
t
 
S
e
t
t
i
n
g
s
 
S
o
c
k
e
t
s
 
A
P
I
 
WSAStartup  
 
- loads WS2_32.dll
WSACleanup 
 
- unloads dll
socket
  
- create socket object
connect
  
- connect client to server
bind
   
- bind server socket to address/port
listen
  
- request server to listen for connection requests
accept
  
- server accepts a client connection
send
   
- send data to remote socket
recv
   
- collect data from remote socket
Shutdown
  
- close connection
closesocket
  
- closes socket handle
 
S
e
q
u
e
n
c
e
 
o
f
 
S
e
r
v
e
r
 
C
a
l
l
s
 
WSAStartup
socket (create listener socket)
bind
listen
accept
create new socket so listener can continue listening
create new thread for socket
send and recv
closesocket (on new socket)
terminate thread
shutdown
closesocket (on listener socket)
WSACleanup
 
W
S
A
S
t
a
r
t
u
p
 
 
wVersionRequested = MAKEWORD(1,1);
WSAData wData;
lpWSAData = &wData
int WSAStartup(
  WORD wVersionRequested,
  LPWSADATA lpWSAData
)
Loads 
WS2_32.dll
 
T
C
P
/
I
P
 
s
o
c
k
e
t
 
 
af 
  
= AF_INET
type 
 
= SOCK_STREAM
protocol
 
= IPPROTO_IP
SOCKET socket(int af, int type, int protocol)
Creates a socket object and returns handle to socket.
 
 
struct sockaddr_in local;
… define fields of local …
name = (sockaddr*)&local
namelen = sizeof(local)
 
int bind(
  SOCKET s,
  const struct sockaddr *name,
  int namelen
)
Bind listener socket to network card and port
 
B
i
n
d
 
s
o
c
k
e
t
 
L
i
s
t
e
n
 
f
o
r
 
i
n
c
o
m
i
n
g
 
r
e
q
u
e
s
t
s
 
 
int listen(SOCKET s, int backlog)
 
backlog is the number of incoming connections queued (pending) for
acceptance
Puts socket in listening mode, waiting for requests for service from
remote clients.
 
A
c
c
e
p
t
 
I
n
c
o
m
i
n
g
 
C
o
n
n
e
c
t
i
o
n
 
 
SOCKET accept(
  SOCKET s,
  struct sockaddr *addr,
  int *addrLen
)
Blocking call, accepts a pending request for service and returns a
socket bound to a new port for communication with new client.
Usually server will spawn a new thread to manage the socket
returned by accept, often using a thread pool.
 
C
l
i
e
n
t
/
S
e
r
v
e
r
 
C
o
n
f
i
g
u
r
a
t
i
o
n
 
r
e
c
v
 
 
int recv(
  SOCKET s,
  char *buff,
  int len,
  int flags
)
Receive data in buff up to len bytes.
Returns actual number of bytes read.
flags variable should normally be zero.
 
s
e
n
d
 
 
int send(
  SOCKET s,
  char *buff,
  int len,
  int flags
)
Send data in buff up to len bytes.
Returns actual number of bytes sent.
flags variable should normally be zero.
 
s
h
u
t
d
o
w
n
 
 
int shutdown(SOCKET s, int how)
how = SD_SEND or SD_RECEIVE or SD_BOTH
Disables new sends, receives, or both, respectively.  Sends a FIN to server
causing thread for this client to terminate (server will continue to listen for
new clients).
 
c
l
o
s
e
s
o
c
k
e
t
 
 
int closesocket(SOCKET s)
Closes socket handle s, returning heap allocation
for that data structure back to system.
 
W
S
A
C
l
e
a
n
u
p
 
 
int WSACleanup( )
Unloads 
W2_32.dll
 if no other users.  Must call this once for each call
to 
WSAStartup
.
 
S
e
q
u
e
n
c
e
 
o
f
 
C
l
i
e
n
t
 
C
a
l
l
s
 
WSAStartup
socket
address resolution 
 
- set address and port of
 
    
  intended receiver
connect
   
- send and recv
shutdown
closesocket
WSACleanup
 
T
C
P
 
A
d
d
r
e
s
s
e
s
 
 
I
P
4
 
struct sockaddr_in{
    
 
short 
 
 
  
sin_family;
  
unsigned short 
 
sin_port;
  
struct in_addr 
 
sin_addr;
  
char
  
 
  
sin_zero[8];
  } SOCKADDR_IN;
 
T
C
P
/
I
P
 
A
d
d
r
e
s
s
 
f
i
e
l
d
s
 
-
 
I
P
4
 
sin_family
  
AF_INET
sin_port
  
at or above 1024
sin_addr
  
inet_addr(“127.0.0.1”);
sin_zero
  
padding
Setting sin_addr.s_addr = INADDR_ANY allows a server
application to listen for client activity on every network
interface on a host computer.
 
c
o
n
n
e
c
t
 
 
int connect(
  SOCKET s,
  const struct sockaddr *name,
  int namelen
)
Connects client socket to a specific machine and port.
 
S
p
e
c
i
a
l
 
F
u
n
c
t
i
o
n
s
 
htons –
 
converts short from host to
 
  
network byte order
htonl –  
 
converts long from  host to network
 
  
byte order
ntohs –  converts short from network to host
 
  
byte order
ntohl  –  
 
converts long from network to host
 
  
byte order
 
A
 
W
o
r
d
 
o
f
 
C
a
u
t
i
o
n
 
With stream oriented sockets, send does not guarantee
transfer of all bytes requested in a single call.
That’s why send returns an int, the number of bytes
actually send.
It’s up to you to ensure that all the bytes are actually sent
See my code example – socks.cpp
 
Non-Blocking Communication
 
Store and Forward Architecture
 
Messaging System Architecture
 
T
a
l
k
 
P
r
o
t
o
c
o
l
 
The hardest part of a client/server socket communication
design is to control the active participant
If single-threaded client and server both talk at the same time,
their socket buffers will fill up and they both will block, e.g.,
deadlock.
If they both listen at the same time, again there is deadlock.
Often the best approach is to use separate send and receive
threads
 
M
e
s
s
a
g
e
 
L
e
n
g
t
h
 
Another vexing issue is that the receiver may not know
how long a sent message is.
so the receiver doesn’t know how many bytes to pull from the
stream to compose a message.
Often, the communication design will arrange to use message
delimiters, fixed length messages, or message headers that carry
the message length as a parameter.
For examples see:
Repository/CppStringSocketServer 
 
// uses string delimiter
Repository/CommWithFileXfer
  
// uses messages with headers
 
M
e
s
s
a
g
e
 
F
r
a
m
i
n
g
 
Sockets only understand arrays of bytes
Don’t know about strings, messages, or objects
In order to send messages you simply build the message
string, probably with XML
string msg = “<msg>message text goes here</msg>”
Then send(sock,msg,strlen(msg),flags)
Receiving messages requires more work
Read socket one byte at a time and append to message string:
recv(sock,&ch,1,flags); msg.append(ch);
Search string msg from the back for </
Then collect the msg>
You will find a more sophisticated approach in the
CommWithFileXfer, cited on the previous slide
 
T
h
e
y
r
e
 
E
v
e
r
y
w
h
e
r
e
 
Virtually every network and internet communication method uses
sockets, often in a way that is invisible to an application designer.
Browser/server
ftp
SOAP
Network applications
 
W
h
a
t
 
w
e
 
d
i
d
n
t
 
t
a
l
k
 
a
b
o
u
t
 
udp protocol
socket select(…) function
non-blocking sockets
 
The End
Slide Note
Embed
Share

Sockets provide a standard interface for network protocols like TCP/IP, enabling connections between machines to send and receive data. The TCP protocol, part of the TCP/IP suite, is crucial for internet communications. Learn about the logical structure of sockets and how to create socket connections based on different domains and protocols.

  • Sockets
  • Network Protocols
  • TCP/IP
  • Internet Communications
  • Connection Establishment

Uploaded on Sep 21, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. Win32 Sockets Win32 Sockets Jim Fawcett CSE 687-OnLine Object Oriented Design Summer 2017

  2. What are Sockets? What are Sockets? Sockets provide a common interface to the various protocols supported by networks. They allow you to establish connections between machines to send and receive data. Sockets support the simultaneous connection of multiple clients to a single server machine.

  3. TCP Protocol TCP Protocol TCP/IP stands for "Transmission Control Protocol / Internet Protocol. TCP/IP is the most important of several protocols used on the internet. Some others are: HyperText Transport Protocol (HTTP), File Transfer Protocol (FTP), Simple Mail Transfer Protocol (SMTP), and Telnet, a protocol for logging into a remote computer. Sockets provide a standard interface for a variety of network protocols. TCP/IP is, by far, the most commonly used protocol for sockets. Here are the main features of TCP/IP: IP is a routable protocol. That means that TCP/IP messages can be passed between networks in a Wide Area Network (WAN) cluster. Each device using TCP/IP must have an IP address. This address is a 32 bit word, organized into four 8-bit fields, called octets. Part of the IP address identifies the network and the rest identifies a specific host on the network. IP addresses are organized into three classes. Each class has a different allocation of octets to these two identifiers. This allows the internet to define many networks, each containing up to 256 devices (mostly computers), and a few networks, each containing many more devices. A single machine can run mulitple communictaions sessions using TCP/IP. That is, you can run a web browser while using Telnet and FTP, simultaneously.

  4. TCP/IP based Sockets TCP/IP based Sockets Connection-oriented means that two communicating machines must first connect. All data sent will be received in the same order as sent. Note that IP packets may arrive in a different order than that sent. This occurs because all packets in a communication do not necessarily travel the same route between sender and receiver. Streams mean that, as far as sockets are concerned, the only recognized structure is bytes of data.

  5. Socket Logical Structure Socket Logical Structure Socket bytes recv buffer recv buffer bytes recv buffer Socket

  6. Creating Sockets Creating Sockets Socket connections are based on: Domains network connection or IPC pipe AF_INET for IPv4 protocol AF_INET6 for IPv6 protocol Type stream, datagram, raw IP packets, SOCK_STREAM TCP packets SOCK_DGRAM UDP packets Protocol TCP, UDP, 0 default, e.g., TCP for SOCK_STREAM Example: HANDLE sock = socket(AF_INET,SOCK_STREAM,0);

  7. Connecting Connecting Sockets Sockets Socket addresses struct SOCKADDR_IN { sin_family sin_address.s_addr sin_port } addr; // AF_INET // inet_addr( 127.0.0.1 ); // htons(8000); Bind server listener to port: int err = bind(sock, (SOCKADDR_IN*)&addr,sizeof(addr)); Connect client to server: HANDLE connect(sock, (SOCKADDR_IN*)&addr,sizeof(addr))

  8. Client / Server Processing Client / Server Processing Server Client socket() socket() bind() listen() accept() connect() recv() send() send() recv() close() close()

  9. Accessing Sockets Library Accessing Sockets Library #include <winsock2.h> Link with wsock32.lib To build a server for multiple clients you will need to use threads, e.g.: #include <process.h> // Win32 threads or #include<threads> // C++11 threads and use the Project Settings: C/C++ language\category=code generation\debug multithreaded

  10. Project Settings Project Settings

  11. Sockets API Sockets API WSAStartup WSACleanup socket connect bind listen accept send recv Shutdown closesocket - loads WS2_32.dll - unloads dll - create socket object - connect client to server - bind server socket to address/port - request server to listen for connection requests - server accepts a client connection - send data to remote socket - collect data from remote socket - close connection - closes socket handle

  12. Sequence of Server Calls Sequence of Server Calls WSAStartup socket (create listener socket) bind listen accept create new socket so listener can continue listening create new thread for socket send and recv closesocket (on new socket) terminate thread shutdown closesocket (on listener socket) WSACleanup

  13. WSAStartup WSAStartup wVersionRequested = MAKEWORD(1,1); WSAData wData; lpWSAData = &wData int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ) Loads WS2_32.dll

  14. TCP/IP socket TCP/IP socket af type protocol = IPPROTO_IP = AF_INET = SOCK_STREAM SOCKET socket(int af, int type, int protocol) Creates a socket object and returns handle to socket.

  15. Bind socket Bind socket struct sockaddr_in local; define fields of local name = (sockaddr*)&local namelen = sizeof(local) int bind( SOCKET s, const struct sockaddr *name, int namelen ) Bind listener socket to network card and port

  16. Listen for incoming requests Listen for incoming requests int listen(SOCKET s, int backlog) backlog is the number of incoming connections queued (pending) for acceptance Puts socket in listening mode, waiting for requests for service from remote clients.

  17. Accept Incoming Connection Accept Incoming Connection SOCKET accept( SOCKET s, struct sockaddr *addr, int *addrLen ) Blocking call, accepts a pending request for service and returns a socket bound to a new port for communication with new client. Usually server will spawn a new thread to manage the socket returned by accept, often using a thread pool.

  18. Client/Server Configuration Client/Server Configuration Client Client Socket Server Main Thread Socket Receiver Thread data port Server Socket use socket data Thread Create listener port listener socket

  19. recv recv int recv( SOCKET s, char *buff, int len, int flags ) Receive data in buff up to len bytes. Returns actual number of bytes read. flags variable should normally be zero.

  20. send send int send( SOCKET s, char *buff, int len, int flags ) Send data in buff up to len bytes. Returns actual number of bytes sent. flags variable should normally be zero.

  21. shutdown shutdown int shutdown(SOCKET s, int how) how = SD_SEND or SD_RECEIVE or SD_BOTH Disables new sends, receives, or both, respectively. Sends a FIN to server causing thread for this client to terminate (server will continue to listen for new clients).

  22. closesocket closesocket int closesocket(SOCKET s) Closes socket handle s, returning heap allocation for that data structure back to system.

  23. WSACleanup WSACleanup int WSACleanup( ) Unloads W2_32.dll if no other users. Must call this once for each call to WSAStartup.

  24. Sequence of Client Calls Sequence of Client Calls WSAStartup socket address resolution - set address and port of intended receiver connect - send and recv shutdown closesocket WSACleanup

  25. TCP Addresses TCP Addresses IP4 IP4 struct sockaddr_in{ short unsigned short struct in_addr char } SOCKADDR_IN; sin_family; sin_port; sin_addr; sin_zero[8];

  26. TCP/IP Address fields TCP/IP Address fields - - IP4 IP4 sin_family sin_port sin_addr sin_zero AF_INET at or above 1024 inet_addr( 127.0.0.1 ); padding Setting sin_addr.s_addr = INADDR_ANY allows a server application to listen for client activity on every network interface on a host computer.

  27. connect connect int connect( SOCKET s, const struct sockaddr *name, int namelen ) Connects client socket to a specific machine and port.

  28. Special Functions Special Functions htons converts short from host to network byte order htonl converts long from host to network byte order ntohs converts short from network to host byte order ntohl converts long from network to host byte order

  29. A Word of Caution A Word of Caution With stream oriented sockets, send does not guarantee transfer of all bytes requested in a single call. That s why send returns an int, the number of bytes actually send. It s up to you to ensure that all the bytes are actually sent See my code example socks.cpp

  30. Non-Blocking Communication Process #1 Process #2 sender receiver receiver thread function sending data to Process #2 processing thread interprocess communication FIFO queue function receiving data from Process #1

  31. Talk Protocol Talk Protocol The hardest part of a client/server socket communication design is to control the active participant If single-threaded client and server both talk at the same time, their socket buffers will fill up and they both will block, e.g., deadlock. If they both listen at the same time, again there is deadlock. Often the best approach is to use separate send and receive threads

  32. State Chart - Socket Bilateral Communication Protocol Server s Client Handler /extract token /receive done receiving sending /send token /extract message /send message /send token /send token sending receiving /send done /extract token /send message /extract message Each connection channel contains one sending token. Client

  33. Message Length Message Length Another vexing issue is that the receiver may not know how long a sent message is. so the receiver doesn t know how many bytes to pull from the stream to compose a message. Often, the communication design will arrange to use message delimiters, fixed length messages, or message headers that carry the message length as a parameter. For examples see: Repository/CppStringSocketServer Repository/CommWithFileXfer // uses string delimiter // uses messages with headers

  34. Message Framing Message Framing Sockets only understand arrays of bytes Don t know about strings, messages, or objects In order to send messages you simply build the message string, probably with XML string msg = <msg>message text goes here</msg> Then send(sock,msg,strlen(msg),flags) Receiving messages requires more work Read socket one byte at a time and append to message string: recv(sock,&ch,1,flags); msg.append(ch); Search string msg from the back for </ Then collect the msg> You will find a more sophisticated approach in the CommWithFileXfer, cited on the previous slide

  35. Theyre Everywhere They re Everywhere Virtually every network and internet communication method uses sockets, often in a way that is invisible to an application designer. Browser/server ftp SOAP Network applications

  36. What we didnt talk about What we didn t talk about udp protocol socket select( ) function non-blocking sockets

  37. The End

Related


More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#