Socket 类 > 方法 > Socket.BeginSendTo
向特定远程主机异步发送数据。 [Visual Basic] Public Function BeginSendTo( _ ByVal buffer() As Byte, _ ByVal offset As Integer, _ ByVal size As Integer, _ ByVal socketFlags As SocketFlags, _ ByVal remoteEP As EndPoint, _ ByVal callback As AsyncCallback, _ ByVal state As Object _ ) As IAsyncResult [C#] public IAsyncResult BeginSendTo( byte[] buffer, int offset, int size, SocketFlags socketFlags, EndPoint remoteEP, AsyncCallback callback, object state ); [C++] public: IAsyncResult* BeginSendTo( unsigned char buffer __gc[], int offset, int size, SocketFlags socketFlags, EndPoint* remoteEP, AsyncCallback* callback, Object* state ); [JScript] public function BeginSendTo( buffer : Byte[], offset : int, size : int, socketFlags : SocketFlags, remoteEP : EndPoint, callback : AsyncCallback, state : Object ) : IAsyncResult; 参数
返回值引用异步发送的 IAsyncResult。 异常
备注BeginSendTo 方法可启动对 remoteEP 参数中指定的远程主机的异步发送操作。调用 BeginSendTo 方法将使您能够在单独的执行线程中发送数据。尽管 BeginSendTo 是用于无连接协议的,但它对无连接和面向连接的协议均适用。 您可以创建一个实现 AsyncCallback 委托的回调方法并将它的名称传递给 BeginSendTo 方法。为此,您的 state 参数至少必须包含用于通信的已连接或默认 Socket。如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。通过 state 参数将此类的一个实例传递给 BeginSendTo 方法。 回调方法应实现 EndSendTo 方法。当应用程序调用 BeginSendTo 时,系统将使用一个单独的线程来执行指定的回调方法,并阻塞 EndSendTo,直到 Socket 发送了请求的字节数或引发了异常为止。如果希望在调用 BeginSendTo 方法之后使原始线程阻塞,请使用 WaitHandle.WaitOne 方法。如果希望原始线程继续执行,请在回调方法中调用 ManualResetEvent.Set。有关编写回调方法的其他信息,请参见 如果当前使用的是面向连接的协议,则必须首先调用 Connect、BeginConnect、Accept 或 BeginAccept 方法,否则 BeginSendTo 将会引发 SocketException。BeginSendTo 将会忽略 remoteEP 参数并将数据发送给在 Connect、BeginConnect、Accept 或 BeginAccept 方法中建立的 EndPoint。 如果当前使用的是无连接协议,则在调用 SendTo 之前,不需要使用 Connect 或 BeginConnect 方法来建立默认远程主机。仅当打算调用 BeginSend 方法时,才需要这样做。如果在调用 SendTo 之前确实调用了 Connect 或 BeginConnect 方法,则 remoteEP 参数将只为该发送操作重写指定的默认远程主机。此外,您还不需要调用 Bind 方法。在这种情况下,基础服务提供程序将会分配最合适的本地网络地址和端口号。如果需要标识分配的本地网络地址和端口号,可以在 EndSendTo 方法成功完成后使用 LocalEndPoint 属性。 如果需要向一个广播地址发送数据,必须先调用 SetSocketOption 方法,然后将套接字选项设置为 SocketOptionName.Broadcast。还必须保证缓冲区大小不超过基础服务提供程序的最大数据包大小。如果超过,将不会发送数据报,并且 EndSendTo 将引发 SocketException。 如果将 DontRoute 标志指定为 socketflags 参数,则将不路由要发送的数据。如果将 OutOfBand 标志指定为 socketflags 参数,则只发送带外 (OOB) 数据。OOB 数据是与每对已连接流式套接字关联并在逻辑上独立的传输通道。此数据以高优先级传送,独立于普通的数据。 注意 如果收到 SocketException,请使用 SocketException.ErrorCode 获取具体的错误代码。获取该代码后,可以参考 MSDN 中的 Windows Socket Version 2 API(Windows 套接字第 2 版 API)错误代码文档以获取有关错误的详细说明。 示例[Visual Basic, C#, C++] 下面的示例向指定远程主机异步发送数据。 [Visual Basic] 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 'SendTo [C#] 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()); } [C++] IPHostEntry* lipa = Dns::Resolve(S"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(S"This is a test"); Console::WriteLine(S"Sending Message Now.."); AsyncCallback* pasync = new AsyncCallback(0, &Async_Send_Receive::SendTo_Callback); s->BeginSendTo(buff, 0, buff->Length, SocketFlags::None, lep, pasync, s); allDone->WaitOne(); } } catch (Exception* e) { Console::WriteLine(e); } [JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C++ 示例,请单击页左上角的“语言筛选器”按钮 。 要求平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版, 公共语言基础结构 (CLI) 标准 请参见Socket 类 | Socket 成员 | System.Net.Sockets 命名空间 | |