|
Network Programming in C# |
|
Part 1. IP Programming Basics |
1.TCP : An Overview TCP Application Ports
2.UDP : An Overview UDP ports
|
Part 2.C# Network Programming Basics
1.What is Socket Programming
a) Sockets in general
2.C# Socket Programming
a)IP addresses in C#
i )IP address
ii) IPEndPoint
b)Using C# sockets
i )Socket Construction
ii)Socket Options
iii)Connection Oriented Sockets
a)Client Sockets
b)Server Sockets
iv)Connectionless Sockets
|
Part 3. Network Layer Programming
1.Using TCP with Connection Oriented Sockets
i ) A Simple TCP server
ii)A Simple TCP client
iii)Using C# stream with TCP
2.Using UDP with Connectionless Sockets
i ) A simple UDP server
ii) A simple UDP client
3.Using C# Helper Classes
i ) TCP Client Class
ii)TCP Listener Class
iii)UDP Client Class
|
Part 4.Application Layer Programming
1.Programming with ICMP
i )ICMP in general
ii)Raw Sockets
iii)An ICMP class
iv)A simple Ping Programe
2.Programming with SMTP
i )SMTP & Email in general
ii)The SmtpClass
iii)Using Expanded Mail Message Formats
iv)POP3 protocol in general
v)A POP3 client
3.Programming with HTTP
i )The WebClient Class
ii)Downloading Web Data methods
iii)Viewing HTTP headers methods
iv)Uploading Web Data methods
v)Credentials property
|
|
Part 1. IP Programming Basics
|
|
1. TCP: An Overview
|
Transmission Control Protocol (TCP) adds connection information to the data packet.
It creates an end-to-end connection providing a consistent path for data to travel.
· To communicate with an application on a remote device, you must know :
i. The remote device’s IP address
ii. The TCP port assigned to the remote application Figure:
Sample TCP connection
|
|
IP EndPoint:
|
|
The combination of an IP address and a port number defines an IP endpoint.
|
|
Session:
|
A TCP session is defined as the combination of a local IP endpoint and a remote
IP endpoint.
Only one session can have both these properties the same.
|
NOTE:
Ports that are numbered from 0 to 1023 are called well-known ports because they
are assigned to specific, common applications.
Ports numbered from 1024 to 65,535 are open for use by any application
|
|
Table: TCP Flags
|
|
Flags |
Description |
|
6 bits that are reserved
|
Reserved for future use—always zero
|
|
1-bit URG flag
|
Marks the packet as containing urgent data
|
|
1-bit ACK flag
|
Acknowledges receiving a packet
|
|
1-bit PUSH flag
|
Indicates data is to be pushed to the application immediately
|
|
1-bit RESET flag
|
Resets the TCP connection to the initial state
|
|
1-bit SYN flag
|
Indicates a TCP synchronization packet (start-of-session)
|
|
1-bit FIN flag
|
Indicates a TCP end-of-session
|
|
The TCP session has three phases: · Opening handshake:
1. The originating host sends a SYN flag to indicate the start of a session.
2. The receiving host sends both a SYN flag and an ACK flag in the same packet to
indicate it accepts the start of the session.
3. The originating host sends an ACK flag to indicate the session is open and ready
for packets.
|
|
Session communication: After the session is established, you will see the ACK flag
set on packets, indicating that the device is acknowledging the receipt of a packet
with a particular sequence number. |
Closing handshake:
1. The host initiating the close sends a FIN flag.
2. The remote host sends both an ACK flag and a FIN flag in the same packet to indicate
it accepts the end of the session.
3. The initiating host sends an ACK flag to officially close the session.
|
|
2.UDP: An Overview
|
Unlike TCP, UDP provides a connectionless path between network devices to transmit
data, and thus does not need all of the overhead of session establishment flags
and connection states. Each UDP “session” is nothing more than a single packet transmitted
in one direction. Like TCP, UDP tracks individual connections using port numbers
and assigns port numbers from 0 to 1023 to reserved application ports.
Ports 1024 to 65536 are available for you to use in your applications
|
|
Part 2.C# Network Programming Basics |
|
1. Sockets:
|
The special file descriptors used to reference network connections are called sockets.
The socket defines the following:
- A specific communication domain, such as a network connection or a Unix Interprocess
Communication (IPC) pipe
- A specific communication type, such as stream or datagram
- A specific protocol, such as TCP or UDP NOTE: After the socket is created, it must
be bound to either a specific network address and port on the local system, or to
a remote
NOTE: After the socket is created, it must be bound to either a specific network
address and port on the local system, or to a remote
|
|
|
|
a) Connection-Oriented Sockets:
|
- They use TCP protocol to establish a session (connection) between two IP address
endpoints.
- To create a connection-oriented socket, separate sequences of functions must be
used for server programs and for client programs
|
|
b) Connectionless Sockets: |
- They use the UDP protocol,
- No connection information is required to be sent between network devices.
NOTE: If a device is initially waiting for data from a remote device, the socket
must be bound to a local address/port pair using the bind( ) function. Once this
is done the device can send data out from the socket, or receive incoming data from
the socket
|
|
2. C# Socket Programming: |
a) IP Addresses in C#: .NET defines two classes in the System.Net namespace to handle
various types of IP address information:
|
|
i. IPAddress : |
An IPAddress object is used to represent a single IP address. The default constructor
for IPAddress is as follows:
public IPAddress(long address)
|
IPAddress Methods
|
|
|
|
|
Equals
|
Compares two IP addresses |
|
GetHashCode
|
Returns a hash value for an IPAddress object |
|
GetType
|
Returns the type of the IP address instance |
|
HostToNetworkOrder
|
Converts an IP address from host byte order to network byte order |
|
IsLoopBack
|
Indicates whether the IP address is considered the loopback address |
|
NetworkToHostOrder
|
Converts an IP address from network byte order to host byte order |
|
Parse
|
Converts a string to an IPAddress instance |
|
ToString |
Converts an IPAddress to a string representation of the dotted decimal format of
the IP address |
|
The Parse( ) method is most often used to create IPAddress instances:
IPAddress newaddress = IPAddress.Parse("192.168.1.1");
|
|
Properties: |
|
Any
|
Used to represent any IP address available on the local system. |
|
Broadcast |
Used to represent the IP broadcast address for the local network. |
|
Loopback |
Used to represent the loopback address of the system |
|
None
|
Used to represent no network interface on the system. |
|
|
|
|
ii IPEndPoint: |
IPEndPoint object is used to represent a specific IP address/port combination. An
IPEndPoint object is used when binding sockets to local addresses, or when connecting
sockets to remote addresses. Two constructors are used to create IPEndPoint instances:
- IPEndPoint (long address, int port)
- IPEndPoint (IPAddress address, int port)
|
|
Methods: |
|
IPEndPoint Methods
|
|
Method |
Description |
|
Create
|
Creates an EndPoint object from a SocketAddress object |
|
Equals
|
Compares two IPEndPoint objects |
|
GetHashCode
|
Returns a hash value for an IPEndPoint object |
|
GetType |
Returns type of the IPEndPoint instance |
|
Serialize
|
Creates a SocketAddress instance of the IPEndPoint instance |
|
|
|
|
ToString
|
Creates a string representation of the IPEndPoint instance |
|
|
Properties:
|
|
Address
|
Gets or sets the IP address property |
|
AddressFamily |
Gets the IP address family |
|
Port
|
Gets or sets the TCP or UDP port number |
|
|
Sockets in C#:
|
|
The System.Net.Sockets namespace contains the classes that provide the actual .NET
interface to the low-level Winsock APIs. The core of the System.Net.Sockets namespace
is the Socket class.
|
|
Socket Construction:
|
The Socket class constructor is as follows: Socket(AddressFamily af, SocketType
st, ProtocolType pt)
- AddressFamily to define the network type
- SocketType to define the type of data connection
- ProtocolType to define a specific network protocol
|
|
IP Socket Definition Combinations
|
|
|
Socket Type |
Protocol |
Description |
|
Dgram |
Udp |
Connectionless communication |
|
Stream |
Tcp |
Connection-oriented communication |
|
Raw |
Icmp |
Internet Control Message Protocol |
|
Raw |
Raw |
Plain IP packet communication |
|
|
e.g. Socket newsock = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
|
Using Connection-Oriented Sockets:
|
|
Socket newsock = Socket(AddressFamily.InterNetwork, SocketType.Stream , ProtocolType.Tcp);
|
|
The Server Functions:
|
- Listen (int backlog) :
The backlog parameter defines the number of connections that the system will queue,
waiting for your program to service. Any attempts by clients beyond that number
of waiting connections will be refused.
- Accept( )
|
|
e.g. IPHostEntry local = Dns.GetHostByName(Dns.GetHostName());
IPEndPoint iep = new IPEndPoint(local.AddressList[0], 8000);
Socket newserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
newserver.Bind(iep);
newserver.Listen(5);
Socket newclient = newserver.Accept ();
|
|
|
|
The Client Functions:
|
· Connect(IPEndPoint) Requires an IPEndPoint object for the remote device to which
the client needs to connect:
- Shutdown() To gracefully stop a session
- Close( ) To actually close the session
The shutdown( ) method uses one parameter to determine how the socket will shutdown.
Available values for Socket.Shutdown ( ) are described in Table.
|
|
Socket.Shutdown Values
|
|
Value |
Description |
|
SocketShutdown.Both
|
Prevents both sending and receiving data on the socket |
|
SocketShutdown.Receive
|
Prevents receiving data on the socket. An RST will be sent if additional data is
received. |
|
SocketShutdown.Send
|
Prevents sending data on the socket. A FIN will be sent after all remaining
buffer data is sent. |
|
Here is the typical way to gracefully close a connection:
sock.Shutdown(SocketShutdown.Both);
sock.Close();
|
|
Using Connectionless Sockets:
|
The standard Receive( ) and Send() methods will not work.
Use the special ReceiveFrom ( ) and SendTo () methods. ·
For example, the simplest format of the methods would be as follows:
ReceiveFrom(byte[], ref EndPoint)
SendTo(byte[], ref EndPoint)
There is an extra parameter that is a reference to an EndPoint object. This parameter
defines where the data is going (for SendTo ) or where it is coming from (for ReceiveFrom
).
|
|
|
|
|
|
|
|
|