Linux进程通信之Unix套接字(二)

2021-12-14 13:45:23 浏览数 (1)

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

0 人点赞