leves

使一切更加简单!

导航

Socket 类 > 方法 > Socket.BeginSendTo

  MSDN Home >  .NET Framework >  参考 >  类库 >  System.Net.Sockets >  Socket 类 >  方法
.NET Framework 类库  

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;

参数

buffer
Byte 类型的数组,它包含要发送的数据。
offset
buffer 中的从其开始发送数据的、从零开始编排的位置。
size
要发送的字节数。
socketFlags
SocketFlags 值的按位组合。
remoteEP
EndPoint,表示远程设备。
callback
AsyncCallback 委托。
state
包含此请求的状态信息的对象。

返回值

引用异步发送的 IAsyncResult

异常

异常类型 条件
ArgumentNullException buffer 为空引用(Visual Basic 中为 Nothing)。

- 或 -

remoteEP 为空引用 (Nothing)。

SocketException 试图访问套接字时发生错误。有关更多信息,请参见备注部分。
ArgumentOutOfRangeException offset 小于 0。

- 或 -

offset 大于 buffer 的长度。

- 或 -

size 小于 0。

- 或 -

size 大于 buffer 的长度减去 offset 参数的值。

ObjectDisposedException Socket 已关闭。
SecurityException 调用堆栈上部的调用方无权执行所请求的操作。

备注

BeginSendTo 方法可启动对 remoteEP 参数中指定的远程主机的异步发送操作。调用 BeginSendTo 方法将使您能够在单独的执行线程中发送数据。尽管 BeginSendTo 是用于无连接协议的,但它对无连接和面向连接的协议均适用。

您可以创建一个实现 AsyncCallback 委托的回调方法并将它的名称传递给 BeginSendTo 方法。为此,您的 state 参数至少必须包含用于通信的已连接或默认 Socket。如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。通过 state 参数将此类的一个实例传递给 BeginSendTo 方法。

回调方法应实现 EndSendTo 方法。当应用程序调用 BeginSendTo 时,系统将使用一个单独的线程来执行指定的回调方法,并阻塞 EndSendTo,直到 Socket 发送了请求的字节数或引发了异常为止。如果希望在调用 BeginSendTo 方法之后使原始线程阻塞,请使用 WaitHandle.WaitOne 方法。如果希望原始线程继续执行,请在回调方法中调用 ManualResetEvent.Set。有关编写回调方法的其他信息,请参见 Callback 示例

如果当前使用的是面向连接的协议,则必须首先调用 ConnectBeginConnectAcceptBeginAccept 方法,否则 BeginSendTo 将会引发 SocketExceptionBeginSendTo 将会忽略 remoteEP 参数并将数据发送给在 ConnectBeginConnectAcceptBeginAccept 方法中建立的 EndPoint

如果当前使用的是无连接协议,则在调用 SendTo 之前,不需要使用 ConnectBeginConnect 方法来建立默认远程主机。仅当打算调用 BeginSend 方法时,才需要这样做。如果在调用 SendTo 之前确实调用了 ConnectBeginConnect 方法,则 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 命名空间 | 包括异步调用 | Callback 示例 | EndSendTo | AsyncCallback | Connect | LocalEndPoint | Broadcast | SetSocketOption

posted on 2005-09-27 21:08  leves  阅读(3185)  评论(0编辑  收藏  举报