gpt4 book ai didi

delphi - 在监听套接字上接受监听套接字上的连接(并且不再监听)?

转载 作者:行者123 更新时间:2023-12-03 15:55:11 25 4
gpt4 key购买 nike

我正在使用 ICS (TWSocket) 库在 Delphi 6 Pro 中进行套接字编程。我知道我的问题可能看起来很复杂或尴尬,但让我解释一下我的应用程序需求,以便您理解为什么我想做一些违反监听套接字使用的常规约定的事情,即将传入连接分拆到新套接字由 Accept 方法返回并继续在当前设置的端口上监听新连接。

在我的应用程序中,我接受来自 Skype 的连接,以发送和接收与事件 Skype 通话相关的音频缓冲区。问题是,当 Skype 连接时,没有握手、识别或身份验证来让我知道连接的 CALL ID。由于 Skype 可以一起进行电话 session ,因此一次可以有多个正在进行的通话。但是,我需要知道哪些套接字连接属于哪个 CALL ID。

由于连接是如上所述的“盲”连接,因此我可以可靠地将 Skype 套接字连接映射到 CALL ID 的唯一方法是仔细控制我监听的端口号。然后,当我告诉 Skype 将给定 CALL ID 的音频连接到特定端口号时,我知道该套接字上的连接属于该 Skype CALL ID。例如:

  1. 查找可用的端口号,iPortNumber
  2. 将我的套接字设置为监听 iPortNumber
  3. 告诉 Skype 将 CALL ID iCallID 连接到端口号码 iPortNumber
  4. 当我收到 SessionAvailable 事件时,我知道传入的 Skype 连接用于 CALL ID iCallID

对我需要处理的每个调用 ID 进行冲洗和重复。我知道这意味着我最终可能会占用一些额外的端口,但由于同时进行的 Skype 通话数量总是很少,我不认为这是一个问题。我遇到的困难是拥有一个监听套接字的标准约定,当新连接进入时,该监听套接字会使用 Accept 分离出一个新套接字。

我想在监听套接字(同一套接字)上接受连接,然后专门停止监听,而不必关闭连接,因为我不想在该端口上接受任何新连接号码不再了。有办法做到这一点吗?

另一种途径是使用 Accept 返回的新创建的套接字,然后关闭监听套接字,但随后我必须想出一种更复杂的方法来跟踪 Skype CALL ID 的端口号,因为如果我是正确的据我所知,Accept 返回的新创建的套接字连接到与监听套接字不同的端口号上,因此监听套接字可以继续监听现有端口号。如果可以的话,我希望避免额外的复杂性和麻烦。

如果有人对如何将我的盲 Skype 连接映射到与其绑定(bind)的 Skype CALL ID 有更好的整体想法/范例,请告诉我。另外,我认为这是不可能的,但如果有一种巧妙的方法可以从与我的应用程序连接在同一系统上的进程获取传入套接字连接后面的进程 ID,我想知道。

最佳答案

一次性监听套接字并不罕见。例如,FTP 协议(protocol)就使用它们。只需在所需端口上创建一个新的监听套接字(或者让套接字决定自己可以检索的端口),将其 backlog 设置为 1,然后对其调用一次 accept() 并关闭它。如果 accept() 接受客户端连接,它将返回一个新的套接字句柄,您可以使用该句柄与该客户端进行通信。在此期间您不需要保持监听套接字处于事件状态。

我不知道该操作的 ICS 等价物是什么,但在 Indy 中,有一个 TIdSimpleServer 组件正是用于此目的(顺便说一下,Windows 上的 Skype 使用 Indy)。

关于delphi - 在监听套接字上接受监听套接字上的连接(并且不再监听)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7812871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com