Unix套接字通信之Udp
tcp和udp的区别
- Tcp是可靠、稳定的,需要经过三次握手来建立连接,收发消息经过确认、Udp是不可靠的、不需要建立连接
- Tcp需要建立连接确认,速度要比Udp不需要经过连接的慢一点
- Tcp因需要连接,以及收发确认,占用的系统资源可能多点
- Tcp可以发送少量数据,而Udp可以发送大量数据
在外网Udp是不可靠的,但基于Unix本地域通信的Udp是可靠的
服务端代码示例
代码语言:javascript复制<?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= %sn",$data,$clinetFile);
socket_sendto($socket,$data,strlen($data),0,$clinetFile);
}
if(strncasecmp($data,'quit',4) == 0)
{
break;
}
}
客户端代码示例
代码语言:javascript复制<?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=%sn",$pid);
执行服务端代码php demo29.php
,通过ls
命令可以看到已经生成文件,并且通过file
命令可以看到生成的文件是一个socket文件,通过pstree -ap
查看启动的进程id,通过strace
命令监控服务端进程
通过上面的执行结果可以看到,进程之间是可以进行通信的
注意:切记要自行处理生成的socket文件,否则会报address呗占用的错误
本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn