Socket.BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) Method

Definition

Асинхронно передает данные на конкретный удаленный узел.Sends data asynchronously to a specific remote host.

public:
 IAsyncResult ^ BeginSendTo(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ remoteEP, AsyncCallback ^ callback, System::Object ^ state);
public:
 IAsyncResult ^ BeginSendTo(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socket_flags, System::Net::EndPoint ^ remote_end, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginSendTo (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, System.Net.EndPoint remoteEP, AsyncCallback callback, object state);
public IAsyncResult BeginSendTo (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socket_flags, System.Net.EndPoint remote_end, AsyncCallback callback, object state);
member this.BeginSendTo : byte[] * int * int * System.Net.Sockets.SocketFlags * System.Net.EndPoint * AsyncCallback * obj -> IAsyncResult
member this.BeginSendTo : byte[] * int * int * System.Net.Sockets.SocketFlags * System.Net.EndPoint * AsyncCallback * obj -> IAsyncResult
Public Function BeginSendTo (buffer As Byte(), offset As Integer, size As Integer, socketFlags As SocketFlags, remoteEP As EndPoint, callback As AsyncCallback, state As Object) As IAsyncResult
Public Function BeginSendTo (buffer As Byte(), offset As Integer, size As Integer, socket_flags As SocketFlags, remote_end As EndPoint, callback As AsyncCallback, state As Object) As IAsyncResult

Parameters

buffer
Byte[]

Массив типа Byte, который содержит передаваемые данные.An array of type Byte that contains the data to send.

offset
Int32

Отсчитываемая с нуля позиция в параметре buffer, с которой начинается отправка данных.The zero-based position in buffer at which to begin sending data.

size
Int32

Число отправляемых байтов.The number of bytes to send.

socketFlagssocket_flags
SocketFlags

Побитовое сочетание значений SocketFlags.A bitwise combination of the SocketFlags values.

remoteEPremote_end
EndPoint

Объект EndPoint, представляющий удаленное устройство.An EndPoint that represents the remote device.

callback
AsyncCallback

Делегат AsyncCallback.The AsyncCallback delegate.

state
Object

object, содержащий сведения о состоянии для этого запроса.An object that contains state information for this request.

Returns

IAsyncResult

Объект IAsyncResult, который ссылается на асинхронную передачу.An IAsyncResult that references the asynchronous send.

Exceptions

Параметр buffer равен null.buffer is null.

-или--or- Параметр remoteEP равен null.remoteEP is null.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket.

Значение параметра offset меньше 0.offset is less than 0.

-или--or- Значение offset превышает длину buffer.offset is greater than the length of buffer.

-или--or- Значение параметра size меньше 0.size is less than 0.

-или--or- Значение size превышает значение, полученное, если отнять от длины buffer значение параметра offset.size is greater than the length of buffer minus the value of the offset parameter.

Socket был закрыт.The Socket has been closed.

Вызывающий объект, находящийся выше в стеке вызовов, не имеет разрешения на запрошенную операцию.A caller higher in the call stack does not have permission for the requested operation.

Examples

В следующем примере кода асинхронно отправляются данные на указанный удаленный узел.The following code example asynchronously sends data to the specified remote host.

IPHostEntry^ lipa = Dns::Resolve( "host.contoso.com" );
IPEndPoint^ lep = gcnew IPEndPoint( lipa->AddressList[ 0 ], 11000 );

Socket^ s = gcnew Socket( lep->Address->AddressFamily,
   SocketType::Stream,
   ProtocolType::Tcp );
try
{
   while ( true )
   {
      allDone->Reset();

      array<Byte>^ buff = Encoding::ASCII->GetBytes( "This is a test" );

      Console::WriteLine( "Sending Message Now.." );
      s->BeginSendTo( buff, 0, buff->Length, SocketFlags::None, lep,
         gcnew AsyncCallback( &Async_Send_Receive::Connect_Callback ), s );

      allDone->WaitOne();
   }
}
catch ( Exception^ e ) 
{
   Console::WriteLine( e );
}
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

   Socket s = new Socket(lep.Address.AddressFamily,
                               SocketType.Stream,
                                     ProtocolType.Tcp);
   try{

             while(true){
             allDone.Reset();

             byte[] buff = Encoding.ASCII.GetBytes("This is a test");

             Console.WriteLine("Sending Message Now..");
             s.BeginSendTo(buff, 0, buff.Length, 0, lep, new AsyncCallback(Async_Send_Receive.SendTo_Callback), s);

             allDone.WaitOne();
        }
   }
   catch (Exception e){
        Console.WriteLine(e.ToString());
   }
   Dim lipa As IPHostEntry = Dns.Resolve("host.contoso.com")
   Dim lep As New IPEndPoint(lipa.AddressList(0), 11000)
   
   Dim s As New Socket(lep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
   Try
      
      While True
         allDone.Reset()
         
         Dim buff As Byte() = Encoding.ASCII.GetBytes("This is a test")
         
         Console.WriteLine("Sending Message Now..")
         s.BeginSendTo(buff, 0, buff.Length, 0, lep, New AsyncCallback(AddressOf Async_Send_Receive.SendTo_Callback), s)
         
         allDone.WaitOne()
      End While
   Catch e As Exception
      Console.WriteLine(e.ToString())
   End Try
End Sub

Remarks

Метод BeginSendTo запускает асинхронную операцию отправки на удаленный узел, указанный в параметре remoteEP.The BeginSendTo method starts an asynchronous send operation to the remote host specified in the remoteEP parameter. Вызов метода BeginSendTo дает возможность отправки данных в отдельном потоке выполнения.Calling the BeginSendTo method gives you the ability to send data within a separate execution thread. Несмотря на то, что предназначен для протоколов без подключения, BeginSendTo работает с протоколами, ориентированными на подключения и без подключения.Although intended for connectionless protocols, BeginSendTo works with both connectionless and connection-oriented protocols.

Можно создать метод обратного вызова, который реализует делегат AsyncCallback и передать его имя в метод BeginSendTo.You can create a callback method that implements the AsyncCallback delegate and pass its name to the BeginSendTo method. Для этого, как минимум, параметр state должен содержать подключенный или Socket по умолчанию, используемый для связи.To do this, at the very minimum, your state parameter must contain the connected or default Socket being used for communication. Если для обратного вызова требуются дополнительные сведения, можно создать небольшой класс для хранения Socketи другие необходимые сведения.If your callback needs more information, you can create a small class to hold the Socket, and the other required information. Передайте экземпляр этого класса в метод BeginSendTo с помощью параметра state.Pass an instance of this class to the BeginSendTo method through the state parameter.

Метод обратного вызова должен вызывать метод EndSendTo.Your callback method should invoke the EndSendTo method. Когда приложение вызывает BeginSendTo, система будет использовать отдельный поток для выполнения указанного метода обратного вызова и будет блокироваться на EndSendTo до тех пор, пока Socket не отправит запрошенное число байтов или не выдаст исключение.When your application calls BeginSendTo, the system will use a separate thread to execute the specified callback method, and will block on EndSendTo until the Socket sends the number of bytes requested or throws an exception. Если вы хотите, чтобы исходный поток блокировался после вызова метода BeginSendTo, используйте метод WaitHandle.WaitOne.If you want the original thread to block after you call the BeginSendTo method, use the WaitHandle.WaitOne method. Вызовите метод Set для Т:систем.среадинг.мануалресетевент в методе обратного вызова, если нужно, чтобы исходный поток продолжал выполнение.Call the Set method on a T:System.Threading.ManualResetEvent in the callback method when you want the original thread to continue executing. Дополнительные сведения о написании методов обратного вызова см. в разделе маршалирование делегата в качестве метода обратного вызова.For additional information about writing callback methods see Marshaling a Delegate as a Callback Method.

При использовании протокола, ориентированного на соединение, необходимо сначала вызвать метод Connect, BeginConnect, Acceptили BeginAccept или BeginSendTo выдаст исключение SocketException.If you are using a connection-oriented protocol, you must first call the Connect, BeginConnect, Accept, or BeginAccept method, or BeginSendTo will throw a SocketException. BeginSendTo будет игнорировать параметр remoteEP и отправить данные в EndPoint, установленные в Connect, BeginConnect, Acceptили методе BeginAccept.BeginSendTo will ignore the remoteEP parameter and send data to the EndPoint established in the Connect, BeginConnect, Accept, or BeginAccept method.

Если используется протокол без установления соединения, не нужно устанавливать удаленный узел по умолчанию с Connect или BeginConnect метод перед вызовом SendTo.If you are using a connectionless protocol, you do not need to establish a default remote host with the Connect or BeginConnect method prior to calling SendTo. Это необходимо сделать только в том случае, если предполагается вызывать метод BeginSend.You only need to do this if you intend to call the BeginSend method. При вызове метода Connect или BeginConnect до вызова SendToпараметр remoteEP переопределит указанный удаленный узел по умолчанию только для этой операции отправки.If you do call the Connect or BeginConnect method prior to calling SendTo, the remoteEP parameter will override the specified default remote host for that send operation only. Также не требуется вызывать метод Bind.You are also not required to call the Bind method. В этом случае базовый поставщик услуг будет назначать наиболее подходящий адрес локальной сети и номер порта.In this case, the underlying service provider will assign the most appropriate local network address and port number. Если необходимо, чтобы базовый поставщик услуг выберет свободный порт, используйте нуль-порт.Use a port number of zero if you want the underlying service provider to select a free port. Если необходимо указать назначенный локальный сетевой адрес и номер порта, можно использовать свойство LocalEndPoint после успешного завершения метода EndSendTo.If you need to identify the assigned local network address and port number, you can use the LocalEndPoint property after the EndSendTo method successfully completes.

Если вы хотите отправить данные на широковещательный адрес, сначала необходимо вызвать метод SetSocketOption и установить параметр сокета в значение SocketOptionName.Broadcast.If you want to send data to a broadcast address, you must first call the SetSocketOption method and set the socket option to SocketOptionName.Broadcast. — Необходимо также убедиться, что размер буфера не превышает максимальный размер пакета поставщика услуг.-You must also be sure that the size of your buffer does not exceed the maximum packet size of the underlying service provider. Если это так, датаграмма не будет отправлена, а EndSendTo выдаст SocketException.If it does, the datagram will not be sent and EndSendTo will throw a SocketException.

Если в качестве параметра socketflags указан флаг DontRoute, отправляемые данные не будут маршрутизироваться.If you specify the DontRoute flag as the socketflags parameter, the data you are sending will not be routed.

Note

Если вы получаете SocketException, используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

Note

Контекст выполнения (контекст безопасности, олицетворенный пользователь и вызывающий контекст) кэшируется для асинхронных Socket методов.The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. После первого использования определенного контекста (определенного асинхронного метода Socket, определенного экземпляра Socket и конкретного обратного вызова), последующие применения этого контекста приводят к повышению производительности.After the first use of a particular context (a specific asynchronous Socket method, a specific Socket instance, and a specific callback), subsequent uses of that context will see a performance improvement.

Applies to

See also