2012-10-31 51 views
0

我需要同时创建一个作为服务器和客户端的脚本。暂时停止客户端连接到套接字

这需要交替尝试连接。

有没有办法暂时阻止任何客户端连接,当它进入客户端模式并尝试连接?

据我注意到,只有一个永久性的方法来阻止这将涉及开始再听,我试图避免这一点。

这个想法是,这将运行在多个服务器上,它将不得不连接到自己。

每次进行连接时,每个参与者在交换他们需要交换的内容时将其中一个从(客户端/目的地)列表中移除。

因此,我需要一种方法来阻止侦听器,而在极少数情况下尝试连接原因时,两个尝试在完全相同的时间连接到对方,并购买了挂起等待被拾取,但这不会发生。

+0

投票移动到dba.stackexchange.com – Kermit

+3

@njk为什么?这个问题中没有关于数据库或管理的内容。 – EJP

+0

@EJP在我看来,连接发生时阻塞套接字应该位于会话层,而不是应用层。 – Kermit

回答

0

你可以做两种:

  • close()方法监听套接字(也许重新打开它需要的时候)
  • 如果监听套接字变得可读,不调用accept(),但(你可以但是它确实使用操作系统资源)
  • do call accept(),但立即关闭()结果套接字。 (这很粗鲁......)

以上三个选项来自systemcall/OS级别。我不知道PHP如何实现(或包装)它们。

+0

谢谢。一些测试应该揭示它的工作原理和工作原理。 – transilvlad

+0

重读你的问题后,我认为唯一可能的选择是accept()+ lookup(ip)+ close()。客户端IP地址仅在连接请求被接受后才可用。 lookup()应该检查(un)所需连接的(散列)表,由程序的主动部分和被动部分维护。 (这个表可以看作是一个“工作列表”)BTW:我曾经使用这种机制在服务器中实现IP禁止功能:如果IP存在于禁止列表中,只需关闭套接字。 – wildplasser

+0

在没有pcntl或pthreads的PHP中? – transilvlad