在外网Udp是不可靠的,但基于Unix本地域通信的Udp是可靠的
<?php
/**
* Created by PhpStorm
* User: 北溟有鱼QAQ
* Date: 2021-12-11
* Time: 14:28
* Email: 1769360227@qq.com
*/
$file= 'unix_udp_server';
//创建socket
$socket = socket_create(AF_UNIX,SOCK_DGRAM,0);
//bind 到文件
socket_bind($socket,$file);
while (1)
{
//从套接字接收数据,无论它是否面向连接
$len = socket_recvfrom($socket,$data,1024,0,$clinetFile);
if($len)
{
fprintf(STDOUT,"form client recv= %s file= %s\n",$data,$clinetFile);
socket_sendto($socket,$data,strlen($data),0,$clinetFile);
}
if(strncasecmp($data,'quit',4) == 0)
{
break;
}
}
<?php
/**
* Created by PhpStorm
* User: 北溟有鱼QAQ
* Date: 2021-12-13
* Time: 11:20
* Email: 1769360227@qq.com
*/
$serFile = 'unix_udp_server';
$file = 'unix_udp_client';
//创建socket
$socket = socket_create(AF_UNIX,SOCK_DGRAM,0);
//绑定客户端文件,不绑定则服务端无法给客户端发送消息
socket_bind($socket,$file);
$pid = pcntl_fork();
//子进程接收
if($pid == 0)
{
while (1)
{
socket_recvfrom($socket,$data,1024,0,$clinetFile);
if($data)
{
fprintf(STDOUT,"form server recv= %s file= %s \n",$data,$clinetFile);
}
if(strncasecmp($data,'quit',4) == 0)
{
exit(0);
}
}
}
//父进程发送
while (1)
{
$data = fread(STDIN,128);
if($data)
{
socket_sendto($socket,$data,strlen($data),0,$serFile);
}
if(strncasecmp($data,'quit',4) == 0)
{
break;
}
}
$pid= pcntl_wait($status);
fprintf(STDOUT,"child process exit pid=%s\n",$pid);
执行服务端代码php demo29.php
,通过ls
命令可以看到已经生成文件,并且通过file
命令可以看到生成的文件是一个socket文件,通过pstree -ap
查看启动的进程id,通过strace
命令监控服务端进程
通过上面的执行结果可以看到,进程之间是可以进行通信的
本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.amdzz.cn
最新评论