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, checkWrite또는 checkError 매개 변수가 또는 비어 있습니다null.

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 매개 변수가 null이거나 비어 있는 경우

checkWrite 매개 변수가 null이거나 비어 있는 경우

checkError 매개 변수가 null이거나 비어 있는 경우

소켓에 액세스하는 동안 오류가 발생했습니다.

.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 배치해야 합니다. 를 매개 변수로 checkRead 사용하여 를 호출 SelectIList 하여 가독성을 확인합니다. 쓰기 가능성을 위해 소켓을 검사 매개 변수를 checkWrite 사용합니다. 오류 조건을 검색하려면 를 사용합니다 checkError. 를 호출 Select한 후 는 IList 조건을 충족하는 소켓으로만 채워집니다.

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

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

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

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

참고

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

참고

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

참고

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

추가 정보

적용 대상