.NET Framework Class Library
Socket..::.Select Method

Determines the status of one or more sockets.

Namespace:  System.Net.Sockets
Assembly:  System (in System.dll)
Syntax

Visual Basic (Declaration)
Public Shared Sub Select ( _
    checkRead As IList, _
    checkWrite As IList, _
    checkError As IList, _
    microSeconds As Integer _
)
Visual Basic (Usage)
Dim checkRead As IList
Dim checkWrite As IList
Dim checkError As IList
Dim microSeconds As Integer

Socket.Select(checkRead, checkWrite, _
    checkError, microSeconds)
C#
public static void Select(
    IList checkRead,
    IList checkWrite,
    IList checkError,
    int microSeconds
)
Visual C++
public:
static void Select(
    IList^ checkRead, 
    IList^ checkWrite, 
    IList^ checkError, 
    int microSeconds
)
JScript
public static function Select(
    checkRead : IList, 
    checkWrite : IList, 
    checkError : IList, 
    microSeconds : int
)

Parameters

checkRead
Type: System.Collections..::.IList
An IList of Socket instances to check for readability.
checkWrite
Type: System.Collections..::.IList
An IList of Socket instances to check for writability.
checkError
Type: System.Collections..::.IList
An IList of Socket instances to check for errors.
microSeconds
Type: System..::.Int32
The time-out value, in microseconds. A -1 value indicates an infinite time-out.
Exceptions

ExceptionCondition
ArgumentNullException

The checkRead parameter is nullNothingnullptra null reference (Nothing in Visual Basic) or empty.

-and-

The checkWrite parameter is nullNothingnullptra null reference (Nothing in Visual Basic) or empty

-and-

The checkError parameter is nullNothingnullptra null reference (Nothing in Visual Basic) or empty.

SocketException

An error occurred when attempting to access the socket. See the Remarks section for more information.

Remarks

Select is a static method that determines the status of one or more Socket instances. You must place one or more sockets into an IList before you can use the Select method. Check for readability by calling Select with the IList as the checkRead parameter. To check your sockets for writability, use the checkWrite parameter. For detecting error conditions, use checkError. After calling Select, the IList will be filled with only those sockets that satisfy the conditions.

If you are in a listening state, readability means that a call to Accept will succeed without blocking. If you have already accepted the connection, readability means that data is available for reading. In these cases, all receive operations will succeed without blocking. Readability can also indicate whether the remote Socket has shut down the connection; in that case a call to Receive will return immediately, with zero bytes returned.

Select returns when at least one of the sockets of interest (the sockets in the checkRead, checkWrite, and checkError lists) meets its specified criteria, or the microSeconds parameter is exceeded, whichever comes first. Setting microSeconds to -1 specifies an infinite time-out.

If you make a nonblocking call to Connect, writability means that you have connected successfully. If you already have a connection established, writability means that all send operations will succeed without blocking.

If you have made a non-blocking call to Connect, the checkerror parameter identifies sockets that have not connected successfully.

NoteNote:

Use the Poll method if you only want to determine the status of a single Socket.

NoteNote:

This method cannot detect certain kinds of connection problems, such as a broken network cable, or that the remote host was shut down ungracefully. You must attempt to send or receive data to detect these kinds of errors.

NoteNote:

If you receive a SocketException, use the SocketException..::.ErrorCode property to obtain the specific error code. After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation in the MSDN library for a detailed description of the error.

Examples

The following code example uses Select to determine which listening sockets have a connection request.

Visual Basic
Dim ipHostEntry As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim ipAddress As IPAddress = ipHostEntry.AddressList(0)

Dim socket0 As Socket = Nothing
Dim socket1 As Socket = Nothing
Dim socket2 As Socket = Nothing
Dim socket3 As Socket = Nothing
Dim socket4 As Socket = Nothing
Dim socket5 As Socket = Nothing

Dim listenList As New ArrayList()
listenList.Add(socket0)
listenList.Add(socket1)
listenList.Add(socket2)

Dim acceptList As New ArrayList()
acceptList.Add(socket3)
acceptList.Add(socket4)
acceptList.Add(socket5)

Dim i As Integer
For i = 0 To 2
   listenList(i) = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
   CType(listenList(i), Socket).Bind(New IPEndPoint(ipAddress, 11000 + i))
   CType(listenList(i), Socket).Listen(10)
Next i

'Only the sockets that contain a connection request
'will remain in listenList after Select returns.
Socket.Select(listenList, Nothing, Nothing, 1000)

For i = 0 To listenList.Count - 1
   acceptList(i) = CType(listenList(i), Socket).Accept()
Next i
C#
IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostEntry.AddressList[0];

Socket socket0 = null;
Socket socket1 = null; 
Socket socket2 = null; 
Socket socket3 = null; 
Socket socket4 = null; 
Socket socket5 = null; 

ArrayList listenList = new ArrayList();
listenList.Add(socket0);
listenList.Add(socket1);
listenList.Add(socket2);

ArrayList acceptList = new ArrayList();
acceptList.Add(socket3);
acceptList.Add(socket4);
acceptList.Add(socket5);

for( int i = 0; i < 3; i++ )
{
  listenList[i] = new Socket(AddressFamily.InterNetwork,
                             SocketType.Stream,
                             ProtocolType.Tcp);
  ((Socket)listenList[i]).Bind(new IPEndPoint(ipAddress, 11000 + i));
  ((Socket)listenList[i]).Listen(10);
}

// Only the sockets that contain a connection request
// will remain in listenList after Select returns.

Socket.Select(listenList, null, null, 1000);

for( int i = 0; i < listenList.Count; i++ )
{
  acceptList[i] = ((Socket)listenList[i]).Accept();
}
Visual C++
      IPHostEntry^ lipa = Dns::Resolve( Dns::GetHostName() );

      //Gets three separate local endpoints.
      IPEndPoint^ lep1 = gcnew IPEndPoint( lipa->AddressList[ 0 ],11000 );
      IPEndPoint^ lep2 = gcnew IPEndPoint( lipa->AddressList[ 0 ],11001 );
      IPEndPoint^ lep3 = gcnew IPEndPoint( lipa->AddressList[ 0 ],11002 );

      //creates an array of endpoints.
      array<IPEndPoint^>^ipendpoints = gcnew array<IPEndPoint^>(3);
      ipendpoints[ 0 ] = lep1;
      ipendpoints[ 1 ] = lep2;
      ipendpoints[ 2 ] = lep3;

      //Creates three separate sockets.
      Socket^ s1 = gcnew Socket( lep1->Address->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
      Socket^ s2 = gcnew Socket( lep2->Address->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
      Socket^ s3 = gcnew Socket( lep3->Address->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
      array<Socket^>^socketList = gcnew array<Socket^>(3);
      socketList[ 0 ] = s1;
      socketList[ 1 ] = s2;
      socketList[ 2 ] = s3;

      //Binds and Listens on all sockets in the array of sockets.
      for ( int i = 0; i < 3; i++ )
      {
         socketList[ i ]->Bind( ipendpoints[ i ] );
         socketList[ i ]->Listen( 1000 );

      }

      //Calls Select to determine which sockets are ready for reading.
      Socket::Select( safe_cast<IList^>(socketList), nullptr, nullptr, 1000 );

      //Reads on the sockets returned by Select.
      array<Byte>^buffer = gcnew array<Byte>(1024);
      String^ outString;
      for ( Int32 j = 0; j < (socketList->Length - 1); j++ )
      {
         socketList[ j ]->Receive( buffer );
         outString =  "Socket ";
         outString->Concat( j.ToString(),  " has the message", Encoding::ASCII->GetString( buffer ) );
         Console::WriteLine( outString );

      }
   }

};

int main()
{
   return 0;
}

CPP_OLD
        IPHostEntry *lipa = Dns::Resolve(Dns::GetHostName());

        //Gets three separate local endpoints.

        IPEndPoint *lep1 = new IPEndPoint(lipa->AddressList[0], 11000);
        IPEndPoint *lep2 = new IPEndPoint(lipa->AddressList[0], 11001);
        IPEndPoint *lep3 = new IPEndPoint(lipa->AddressList[0], 11002);

        //creates an array of endpoints.
        IPEndPoint *ipendpoints[] = new IPEndPoint* [3];

        ipendpoints[0] = lep1;
        ipendpoints[1] = lep2;
        ipendpoints[2] = lep3;


        //Creates three separate sockets.
        Socket *s1 = new Socket(lep1->Address->AddressFamily,
            SocketType::Stream, ProtocolType::Tcp);

        Socket *s2 = new Socket(lep2->Address->AddressFamily,
            SocketType::Stream, ProtocolType::Tcp);

        Socket *s3 = new Socket(lep3->Address->AddressFamily,
            SocketType::Stream, ProtocolType::Tcp);



        Socket *socketList[] = new Socket *[3];
        socketList[0] = s1;
        socketList[1] = s2;
        socketList[2] = s3;

        //Binds and Listens on all sockets in the array of sockets.
        for (int i = 0; i < 3; i++){
            socketList[i]->Bind(ipendpoints[i]);
            socketList[i]->Listen(1000);
        }


        //Calls Select to determine which sockets are ready for reading.
        Socket::Select( __try_cast<IList*>( socketList ), NULL, NULL, 1000);

        //Reads on the sockets returned by Select.
        Byte buffer[] = new Byte[1024];

        String *outString;
        for (Int32 j=0; j < (socketList->Length-1); j++){
            socketList[j]->Receive(buffer);
            outString = "Socket ";
            outString->Concat((__box(j))->ToString(), " has the message", Encoding::ASCII->GetString(buffer));
            Console::WriteLine(outString);
        }
Platforms

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Version Information

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0, 1.0
See Also

Reference

Tags :


Community Content

Davide Rizzo
Socket.Select timeout of -1 does NOT give "an infinite time-out."
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=286646

When setting the microSeconds value to -1 Socket.Select should wait indefinitely. This is not the actual behavior and it returns immediately!

Microsoft reports:

"There is a workaround that you can use in your application code. By supplying -2 instead of -1 as the timeout value to Socket.Select it will result in the timeout for the underlying winsock select call to be more than 1 hour. In your code where you check the socket lists after the return of Select, if you discover no sockets in the lists, you can simply loop and call Select again with your same sockets of interest.

If there is no activity on your sockets, at worst, your Select call will timeout about once an hour."

Tags : contentbug

Page view tracker