Socket.Select Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
Select(IList, IList, IList, TimeSpan) |
Определяет состояние одного или нескольких сокетов. |
Select(IList, IList, IList, Int32) |
Определяет состояние одного или нескольких сокетов. |
Select(IList, IList, IList, TimeSpan)
- Исходный код:
- Socket.cs
- Исходный код:
- Socket.cs
- Исходный код:
- 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
null
, checkWrite
или checkError
пуст.
Параметр checkRead
, checkWrite
или checkError
содержит слишком много сокетов.
Значение timeout
параметра меньше -1 микросекунд или больше MaxValue микросекунд
Произошла ошибка при попытке доступа к сокету.
Один или несколько сокетов были удалены.
Применяется к
Select(IList, IList, IList, Int32)
- Исходный код:
- Socket.cs
- Исходный код:
- Socket.cs
- Исходный код:
- 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 экземпляров. Перед использованием метода необходимо поместить один или несколько сокетов в IListSelect . Проверьте удобочитаемость путем вызова Select с параметром IList в checkRead
качестве параметра . Чтобы проверка сокеты для записи, используйте checkWrite
параметр . Для обнаружения условий ошибок используйте .checkError
После вызова Selectбудет IList заполнен только теми сокетами, которые удовлетворяют условиям.
Если вы находитесь в состоянии прослушивания, удобочитаемость означает, что вызов Accept будет успешным без блокировки. Если вы уже приняли подключение, удобочитаемость означает, что данные доступны для чтения. В таких случаях все операции получения будут успешно выполнены без блокировки. Удобочитаемость также может указывать, завершил ли удаленный репозиторий Socket подключение. В этом случае вызов Receive будет немедленно возвращен с нулевыми байтами.
Select функция возвращает значение , если хотя бы один из интересующих сокетов (сокеты в checkRead
списках , checkWrite
и checkError
) соответствует заданным условиям или microSeconds
параметр превышен, в зависимости от того, какой из них наступит первым. Значение microSeconds
-1 указывает бесконечное время ожидания.
Если вы выполняете неблокировающий вызов Connect, возможность записи означает, что подключение выполнено успешно. Если подключение уже установлено, возможность записи означает, что все операции отправки будут успешно выполнены без блокировки.
Если вы выполнили неблокирующий вызов Connect, checkerror
параметр определяет сокеты, которые не были успешно подключены.
Примечание
Используйте метод , Poll если требуется определить только состояние одного Socketобъекта .
Примечание
Этот метод не может обнаружить определенные проблемы с подключением, такие как сломанный сетевой кабель или то, что удаленный узел был выключен ненормальным образом. Для обнаружения таких ошибок необходимо попытаться отправить или получить данные.
Примечание
Если вы получаете SocketException, используйте SocketException.ErrorCode свойство , чтобы получить конкретный код ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API сокетов Windows версии 2 , чтобы получить подробное описание ошибки.
См. также раздел
Применяется к
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по