php stream_socket_pair 乱入如何解决??

灰色v碰触

本来使用 stream_socket_pair 是用来父子进程间通信的,实现多进程下,某个子进程消息通过父进程转发给其他子进程(类似于 qq),但是这碰到了一个问题:

$count     = 4;
$childConn = [];
$parent    = null;

for ($i = 0; $i < $count; ++$i)
{
    $pair = stream_socket_pair(STREAM_PF_UNIX , STREAM_SOCK_STREAM , STREAM_IPRROTO_IP);
    $pid = pcntl_fork();

    if ($pid < 0) {
        throw new Exception("创建子进程失败");
    } else if ($pid > 0) {
        fclose($pair);
        $child = $pair;
        $childConn = $child;
        // 监听子进程消息
        listenChild($child); 
    } else {
        fclose($pair);
        $parent = $pair;
        // 监听父进程消息
        listenParent($parent);
    }
}

以上目的就是为每个子进程创建与父进程的通信通道,然结果却发生了令人意外的效果!

比如下面一个通信过程:

父进程pid: 30246
子进程pid: 30247 30248 30249 30250,每个子进程中都监听客户端连接。

客户端A 进入子进程 30247
客户端B 进入子进程 30248
A 客户端发送消息,子进程 30247 接受到消息,要求转发给 30248 中的客户端 B
子进程 30247 调用事先保存的 $parent(与父进程的通信连接),发送消息
... 意外产生了!!
你可能想当然的以为,他绝对是发送给父进程(30246)!
而实际上不是!结果可能是其他子进程!
到这儿,我就很郁闷了,stream_socket_pair 创建的成对套接字,怎么会发生这种现象??

我表示特别无语了 ....跪求大神解救

2400 1 0
1个回答

maq

貌似你的两个连接用反了……

  • 暂无评论
年代过于久远,无法发表回答
🔝