代码之家  ›  专栏  ›  技术社区  ›  Toad

在同一个套接字上可以执行多少个异步套接字请求?

  •  9
  • Toad  · 技术社区  · 15 年前

    当我在一个套接字上调用BeginSend时,我传递一个委托,该委托将在发送数据时(由另一个线程)被调用。

    如果我再次调用BeginSend,而第一次调用还没有“回调”,会发生什么?

    发送数据的正确行为是什么?执行beginsend,并在回调上执行endsend并开始另一个发送?或者让多个beginsend同时工作实际上是明智的?

    这是msdn上的beginsend页,没有给出此问题的答案: BeginSend msdn

    2 回复  |  直到 13 年前
        1
  •  16
  •   Community CDub    8 年前

    正如O.K.W.所说,多个待定 BeginSend 打电话会很好。不过,你可能需要记住一些事情。

    首先,如果这是一个TCP套接字,那么这仍然是一个从对等点到对等点的单一数据流。

    其次,如果你 初学者 调用发生在同一线程上,那么结果将是对等机按照调用的顺序接收数据。如果你的 贝金森德 从不同的线程进行调用,然后数据可以以任何顺序到达,因为每个发送之间可能存在竞争条件。这对您来说可能重要,也可能不重要(取决于您是否在每次发送时都发送离散的、完整的消息)。

    第三,如果您使用TCP,并且发送速度比套接字另一端的代码接收速度快,那么您可以填充TCP窗口,并且TCP堆栈将开始对您的数据流执行流控制。如果你继续发行 初学者 然后,您可能会在这样的情况下结束:当服务器上的TCP堆栈将要发送的数据排队时,您的回调需要越来越长的时间才能被调用(只有在发送了数据之后才获得回调,并且基于TCP窗口的流控制将阻止发送新数据,直到TCP窗口不再“满”;即,对等方已发送AC对于一些数据 in flight )

    然后,您可以进入这样一种情况,即您正在以不可控制的方式耗尽发送机器上的资源(您发出一个 初学者 也不知道何时会完成,每次发送都会使用内存来发送缓冲区,而且可能 non-paged pool 在Winsock代码中… Non-paged pool 是一个系统范围的资源,在Vista之前的操作系统中是非常稀缺的,如果 非分页池 低或筋疲力尽。此外,您还可能将内存页锁定到内存中,并且锁定内存页的数量还有一个系统范围的限制。

    由于这些问题,通常最好实现您自己的协议级流控制,它限制了 初学者 可以随时挂起的调用(可能使用协议级ACK)或使用TCP窗口流控制并使用挂起发送的完成来发出新的发送,您可以将数据排队以发送到自己的内存中,并完全控制使用的资源,以及如果将“太多”数据排队,您将如何操作。有关详细信息,请参阅我的博客: http://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-control-and-asynchronous-writes.html

    请参阅此回复: what happens when tcp/udp server is publishing faster than client is consuming? 有关TCP窗口流控制的更多信息和重叠I/O(在C++陆地上)发生什么,当您忽略它并发出太多重叠的发送时…

    总之,同时发布多个 初学者 调用是优化TCP数据流的方法,但您需要确保发送“太快”,因为一旦发送,您将以无法控制的方式消耗资源,这对运行代码的计算机可能是致命的。所以不允许无限的 初学者 调用是未完成的,理想情况下,对该框进行分析以确保不会耗尽系统范围内的资源。

        2
  •  4
  •   o.k.w    15 年前

    基于我的我 read here ,似乎有多个并发 BeginSend 是可以做到的。

    Excerpt:

    1. 您可以同时对多个beginsend进行排队。你不需要 锁
    2. 如果不创建回调方法,如何知道何时发送 成功吗?你可能想忽略 成功-更像是一场火灾 忘记-方法,但至少你 需要知道什么时候结束是安全的 你的程序。
    3. 您可以做的另一件事是使用从中获得的IAsyncResult BeginSend。你可以用等待手柄 等待操作完成。 但这违背了 首先使用异步。
    4. 我的建议是使用回调,并确保 调用了回调,并且 实际发送的字节数 优雅地结束发送操作。

    更新:
    尝试同时进行 初学者 基于 codes on MSDN 数据无例外发送。但是请记住,必须先打开同一插座的连接。同时 BeginConnect 不会起作用。