다음을 통해 공유


Socket.Select 메서드

정의

오버로드

Select(IList, IList, IList, TimeSpan)

하나 이상의 소켓 상태를 결정합니다.

Select(IList, IList, IList, Int32)

하나 이상의 소켓 상태를 결정합니다.

Select(IList, IList, IList, TimeSpan)

Source:
Socket.cs
Source:
Socket.cs
Source:
Socket.cs

하나 이상의 소켓 상태를 결정합니다.

public:
 static void Select(System::Collections::IList ^ checkRead, System::Collections::IList ^ checkWrite, System::Collections::IList ^ checkError, TimeSpan timeout);
public static void Select (System.Collections.IList? checkRead, System.Collections.IList? checkWrite, System.Collections.IList? checkError, TimeSpan timeout);
static member Select : System.Collections.IList * System.Collections.IList * System.Collections.IList * TimeSpan -> unit
Public Shared Sub Select (checkRead As IList, checkWrite As IList, checkError As IList, timeout As TimeSpan)

매개 변수

checkRead
IList

가독성을 확인할 Socket 인스턴스의 IList.

checkWrite
IList

쓰기 가능성을 확인할 Socket 인스턴스의 IList.

checkError
IList

오류를 확인할 Socket 인스턴스의 IList.

timeout
TimeSpan

시간 제한 값입니다. -1 마이크로초와 같은 값은 무한 시간 제한을 나타냅니다.

예외

checkRead, checkWritecheckError 매개 변수는 모두 null 또는 비어 있습니다. checkRead, checkWrite또는 checkError 중 하나 이상에는 하나 이상의 Socket포함되어야 합니다.

checkRead, checkWrite또는 checkError 매개 변수에 너무 많은 소켓이 포함되어 있습니다.

timeout -1 마이크로초보다 작거나 MaxValue 마이크로초보다 큽니다.

소켓에 액세스하려고 할 때 오류가 발생했습니다.

하나 이상의 소켓이 삭제되었습니다.

적용 대상

Select(IList, IList, IList, Int32)

Source:
Socket.cs
Source:
Socket.cs
Source:
Socket.cs

하나 이상의 소켓 상태를 결정합니다.

public:
 static void Select(System::Collections::IList ^ checkRead, System::Collections::IList ^ checkWrite, System::Collections::IList ^ checkError, int microSeconds);
public static void Select (System.Collections.IList? checkRead, System.Collections.IList? checkWrite, System.Collections.IList? checkError, int microSeconds);
public static void Select (System.Collections.IList checkRead, System.Collections.IList checkWrite, System.Collections.IList checkError, int microSeconds);
static member Select : System.Collections.IList * System.Collections.IList * System.Collections.IList * int -> unit
Public Shared Sub Select (checkRead As IList, checkWrite As IList, checkError As IList, microSeconds As Integer)

매개 변수

checkRead
IList

가독성을 확인할 Socket 인스턴스의 IList.

checkWrite
IList

쓰기 가능성을 확인할 Socket 인스턴스의 IList.

checkError
IList

오류를 확인할 Socket 인스턴스의 IList.

microSeconds
Int32

시간 제한 값(마이크로초)입니다. -1 값은 무한 제한 시간을 나타냅니다.

예외

checkRead, checkWritecheckError 매개 변수는 모두 null 또는 비어 있습니다. checkRead, checkWrite또는 checkError 중 하나 이상에는 하나 이상의 Socket포함되어야 합니다.

소켓에 액세스하려고 할 때 오류가 발생했습니다.

.NET 5 이상: 하나 이상의 소켓이 삭제됩니다.

checkRead, checkWrite또는 checkError 매개 변수에 너무 많은 소켓이 포함되어 있습니다.

예제

다음 코드 예제에서는 Select 사용하여 연결 요청이 있는 수신 대기 소켓을 결정합니다.

      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;
}
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();
}
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

설명

Select 하나 이상의 Socket 인스턴스의 상태를 결정하는 정적 메서드입니다. Select 메서드를 사용하려면 먼저 하나 이상의 소켓을 IList 배치해야 합니다. IList checkRead 매개 변수로 Select 호출하여 가독성을 확인합니다. 소켓의 쓰기 가능성을 확인하려면 checkWrite 매개 변수를 사용합니다. 오류 조건을 검색하려면 checkError사용합니다. Select호출한 후 IList 조건을 충족하는 소켓으로만 채워집니다.

수신 대기 상태인 경우 가독성은 Accept 호출이 차단 없이 성공한다는 것을 의미합니다. 연결을 이미 수락한 경우 가독성은 데이터를 읽을 수 있음을 의미합니다. 이러한 경우 모든 수신 작업은 차단 없이 성공합니다. 가독성은 원격 Socket 연결을 종료했는지 여부를 나타낼 수도 있습니다. 이 경우 Receive 호출이 즉시 반환되며 0바이트가 반환됩니다.

Select 관심 있는 소켓 중 하나 이상(checkRead, checkWritecheckError 목록의 소켓)이 지정된 조건을 충족하거나 microSeconds 매개 변수를 초과하는 경우 반환됩니다. microSeconds -1 설정하면 제한 시간이 제한됩니다.

Connect대한 차단 해제 호출을 하는 경우 쓰기성은 성공적으로 연결되었음을 의미합니다. 이미 연결이 설정된 경우 쓰기성은 모든 보내기 작업이 차단 없이 성공한다는 것을 의미합니다.

Connect대한 비차단 호출을 수행한 경우 checkerror 매개 변수는 성공적으로 연결되지 않은 소켓을 식별합니다.

메모

단일 Socket상태만 확인하려는 경우 Poll 메서드를 사용합니다.

메모

이 메서드는 네트워크 케이블이 끊어졌거나 원격 호스트가 비정상적으로 종료된 것과 같은 특정 종류의 연결 문제를 감지할 수 없습니다. 이러한 종류의 오류를 감지하려면 데이터를 보내거나 받아야 합니다.

메모

SocketException수신하는 경우 SocketException.ErrorCode 속성을 사용하여 특정 오류 코드를 가져옵니다. 이 코드를 가져온 후에는 Windows Sockets 버전 2 API 오류 코드 설명서를 참조하여 오류에 대한 자세한 설명을 참조하세요.

추가 정보

적용 대상