Socket.Select 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
오버로드
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)
매개 변수
- 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)
매개 변수
- 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는 관심 있는 소켓 중 하나 이상(, checkWrite
및 checkError
목록의 소켓checkRead
)이 지정된 조건을 충족하거나 microSeconds
매개 변수를 초과하는 경우 를 반환합니다. -1로 설정 microSeconds
하면 무한 제한 시간이 지정됩니다.
을 차단하지 않고 호출하는 Connect경우 쓰기 가능성은 성공적으로 연결되었음을 의미합니다. 이미 연결이 설정된 경우 쓰기 가능성은 모든 전송 작업이 차단 없이 성공한다는 것을 의미합니다.
에 대한 비 차단 호출을 Connect수행한 경우 매개 변수는 checkerror
성공적으로 연결되지 않은 소켓을 식별합니다.
참고
이 메서드는 네트워크 케이블이 손상되었거나 원격 호스트가 비정상적으로 종료된 것과 같은 특정 종류의 연결 문제를 검색할 수 없습니다. 이러한 종류의 오류를 감지하려면 데이터를 보내거나 받아야 합니다.
참고
를 수신하는 SocketException경우 속성을 사용하여 SocketException.ErrorCode 특정 오류 코드를 가져옵니다. 이 코드를 가져온 후 오류에 대한 자세한 설명 은 Windows 소켓 버전 2 API 오류 코드 설명서를 참조하세요.
추가 정보
적용 대상
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기