The System.Net.Sockets namespace contains the classes that provide the actual .NET interface to the low-level Winsock APIs. This section gives a brief overview of the C# Socket class. The core of the System.Net.Sockets namespace is the Socket class. It provides the C# managed code implementation of the Winsock API. The Socket class constructor is as follows:
Socket(AddressFamily af , SocketType st , ProtocolType pt )
As you can see, the basic format of the Socket constructor mimics the original Unix socket() function. It uses three parameters to define the type of socket to create:
- An AddressFamily to define the network type
- A SocketType to define the type of data connection
- A ProtocolType to define a specific network protocol
Each of these parameters is represented by a separate enumeration within the System.Net_.Sockets namespace. Each enumeration contains the values that can be used. For normal IP communications on networks, the AddressFamily.InterNetwork value should always be used for the AddressFamily. With the InterNetwork AddressFamily, the SocketType parameter must match a particular ProtocolType parameter. You are not allowed to mix and match SocketTypes and ProtocolTypes.
Socket Properties:
Several properties of the Socket class can be used to retrieve information from a created Socket object
Property | Description |
AddressFamily | Gets the address family of the Socket |
Blocking | Gets or sets whether the Socket is in blocking mode |
LocalEndPoint | Gets the local EndPoint object for the Socket |
Connected | Gets a value that indicates if the Socket is connected to a remote device |
RemoteEndPoint | Gets the remote EndPoint information for the Socket |
SocketType | Gets the type of the Socket |
Handle | Gets the operating system handle for the Socket |
ProtocolType | Gets the protocol type of the Socket |
Available | Gets the amount of data that is ready to be read |
Introduction to Socket Exceptions:
One feature of socket programming included in .NET Framework is neither used by Unix nor the Winsock API is socket exceptions. All of the Socket class methods use the SocketException exception. Any socket programming you do should always check for SocketException exceptions and then attempt to recover from the error, or at least warn the user of the problem.
Example: Demonstrate Socket Properties and Socket Exception Handling
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace _CSharpApplication
{
public partial class Form5 : Form
{
public Form5()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e)
{ // Demonstrate Socket Properties
IPAddress _ipAddress = IPAddress .Parse( "127.0.0.1" );
IPEndPoint _ipEndPoint = new IPEndPoint (_ipAddress, 8000);
Socket _socketTest = new Socket ( AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp);
lstSocketProperties.Items.Add( "AddressFamily :: " + _socketTest.AddressFamily);
lstSocketProperties.Items.Add( "SocketType :: " + _socketTest.SocketType);
lstSocketProperties.Items.Add( "ProtocolType :: " + _socketTest.ProtocolType);
lstSocketProperties.Items.Add( "Blocking :: " +_socketTest.Blocking);
_socketTest.Blocking = false ;
lstSocketProperties.Items.Add( "new Blocking :: " + _socketTest.Blocking);
lstSocketProperties.Items.Add( "Connected :: " + _socketTest.Connected);
_socketTest.Bind(_ipEndPoint);
IPEndPoint _newIpEndPoint = ( IPEndPoint )_socketTest.LocalEndPoint;
lstSocketProperties.Items.Add( "Local EndPoint :: " + _newIpEndPoint.ToString());
_socketTest.Close();
}
private void button2_Click( object sender, EventArgs e)
{ //Socket Exceptions
IPAddress _hostIPAddress = IPAddress .Parse( "192.168.1.1" );
IPEndPoint _hostIPEndPoint = new IPEndPoint (_hostIPAddress, 8000);
Socket _socket = new Socket ( AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp);
try
{
_socket.Connect(_hostIPEndPoint);
}
catch ( SocketException e1)
{
lstSocketExceptions.Items.Add( "Problem Connecting To Host ........" );
lstSocketExceptions.Items.Add(e1.ToString());
_socket.Close();
return ;
}
try
{
_socket.Send( Encoding .ASCII.GetBytes( "testing" ));
}
catch ( SocketException ex)
{
lstSocketExceptions.Items.Add( "Problem Sending Data" );
lstSocketExceptions.Items.Add(ex.ToString());
_socket.Close();
return ;
}
_socket.Close();
}
}
}
Output:
Clicking On both the Buttons will display the respective outputs in the listbox





