我正在使用ICS(TWSocket)库在Delphi 6 Pro中进行套接字编程。我知道我的问题可能看起来很复杂或者很尴尬,但让我解释一下我的应用程序需求,这样你才能理解为什么我要做的事情违背了与侦听套接字一起使用的常规约定,即将传入连接转移到新套接字由Accept方法返回并继续侦听当前设置端口上的新连接。
在我的应用程序中,我接受来自Skype的连接,用于发送和接收与Skype活动有关的音频缓冲区。问题是当Skype连接时,没有握手,识别或认证可以让我知道连接的CALL ID。由于Skype可以一起召开电话会议,因此一次可以有多个活动呼叫。但是,我需要知道哪个套接字连接属于哪个CALL ID。
由于连接是如上所述的“盲”连接,因此我能够可靠地将Skype套接字连接映射到CALL ID的唯一方法是仔细控制我收听的端口号。然后,当我告诉Skype将给定CALL ID的音频连接到特定端口号时,我知道该套接字上的连接属于该Skype CALL ID。例如:
冲洗并重复我需要处理的每个CALL ID。我知道这意味着我最终可能会嚼掉一些额外的端口,但由于同时Skype呼叫的数量总是很少,我不认为这是一个问题。我遇到的困难是使用Listening套接字的标准惯例,当新连接进入时,使用Accept旋转新套接字。
我想接受 on 侦听套接字(同一套接字),然后专门停止侦听而不必关闭连接,因为我不想接受该端口上的任何新连接数字了。有没有办法做到这一点?
另一种途径是使用Accept返回的新创建的套接字然后关闭Listening套接字,但是我必须提出一种更复杂的方法来跟踪Skype CALL ID的端口号,因为如果我是正确的据我所知,Accept返回的新创建的套接字连接在与Listening套接字不同的端口号上,因此Listening套接字可以继续监听现有的端口号。如果可以的话,我想避免那种额外的复杂性和麻烦。
如果有人对如何将我的盲人Skype连接映射到与他们绑定的Skype CALL ID有更好的整体想法/范例,请告诉我。此外,我认为这是不可能的,但如果有一个聪明的方法来从与我的应用程序在同一系统上连接的进程获取进程Socket连接,我想知道。
答案 0 :(得分:3)
一次性监听套接字不是那么不寻常。例如,FTP协议使用它们。只需在所需的端口上创建一个新的侦听套接字(或让套接字决定它自己可以检索的端口),将其backlog设置为1,然后只需在其上调用accept()
并关闭它。如果accept()
接受客户端连接,则返回用于与该客户端通信的新套接字句柄。在此期间,您无需保持侦听套接字处于活动状态。
我不知道该操作的ICS等效性是什么,但在Indy中有一个TIdSimpleServer
组件用于此目的(顺便说一下,Windows上的Skype使用Indy)。