.net 异步套接字-处理错误的socket.sync值

.net 异步套接字-处理错误的socket.sync值,.net,sockets,asynchronous,.net,Sockets,Asynchronous,套接字类有一个方法.acceptsync,该方法返回true或false 我原以为假返回值是一种错误情况,但在Microsoft为异步套接字提供的示例中,它们在检查失败后同步调用回调函数,如下所示: public void StartAccept(SocketAsyncEventArgs acceptEventArg) { if (acceptEventArg == null) { acceptEventArg = new Sock

套接字类有一个方法.acceptsync,该方法返回true或false

我原以为假返回值是一种错误情况,但在Microsoft为异步套接字提供的示例中,它们在检查失败后同步调用回调函数,如下所示:

public void StartAccept(SocketAsyncEventArgs acceptEventArg)
    {
        if (acceptEventArg == null)
        {
            acceptEventArg = new SocketAsyncEventArgs();
            acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
        }
        else
        {
            // socket must be cleared since the context object is being reused
            acceptEventArg.AcceptSocket = null;
        }

        m_maxNumberAcceptedClients.WaitOne();
        bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
        if (!willRaiseEvent)
        {
            ProcessAccept(acceptEventArg);
        }
    }

    /// <summary>
    /// This method is the callback method associated with Socket.AcceptAsync operations and is invoked
    /// when an accept operation is complete
    /// </summary>
    void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
    {
        ProcessAccept(e);
    }
public void StartAccept(SocketAsyncEventArgs acceptEventArg)
{
if(acceptEventArg==null)
{
acceptEventArg=新的SocketAsyncEventArgs();
acceptEventArg.Completed+=新的事件处理程序(acceptEventArg_Completed);
}
其他的
{
//由于正在重用上下文对象,因此必须清除套接字
acceptEventArg.AcceptSocket=null;
}
m_maxNumberAcceptedClients.WaitOne();
bool willRaiseEvent=listenSocket.acceptsync(acceptEventArg);
如果(!willRaiseEvent)
{
ProcessAccept(acceptEventArg);
}
}
/// 
///此方法是与Socket.acceptsync操作关联的回调方法,并被调用
///当接受操作完成时
/// 
无效AcceptEventArg_已完成(对象发送方,SocketAsyncEventArgs e)
{
接受(e);
}
他们为什么这样做?它违背了异步套接字的目的,并阻止方法返回。

规范:

如果I/O操作失败,则返回false 同步完成。这个 SocketAsyncEventArgs。已完成 e参数上的事件将不会被删除 引发并将e对象作为 可以立即检查参数 方法调用返回到 检索操作的结果


当它返回false时,您应该立即处理新接受的套接字。

正如Remus所说,当它返回false时,您将同步处理它,而不是异步处理它


是的,同步处理异步调用似乎很奇怪,但这通常只在调用AcceptSync时已有连接等待接受时发生。因为那里已经有连接,所以不需要进行异步I/O调用,并且同步处理速度更快,使用的资源更少

即使在LAN上调用Thread.Sleep,以便确保所有数据都已从客户端到达,我也无法使用TCP使用默认套接字选项使AcceptSync或ReceiveAsync返回false。我想知道是否有可能使用一些独特的选项或UDP返回false,或者在使用NoDelay发送选项时返回false。无论如何,很容易对返回false的可能性进行编码。

如果该方法返回了
false
,则表示:操作已经完成

因此,如果返回
true
,则操作尚未完成

总而言之:

  • 如果该方法返回
    false
    ,请立即处理它
  • 如果该方法返回
    true
    ,则在触发事件时处理它

希望这能有所帮助。

关键是将两个完全不同的行为绑定到一个似乎只明确表示一个行为的函数。幸好它被彻底记录了下来。。。哦,等等。我和你一样感到沮丧。