前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux进程通信之Unix套接字(二)

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

作者头像
北溟有鱼QAQ
发布2021-12-14 13:45:23
1.8K0
发布2021-12-14 13:45:23
举报
文章被收录于专栏:北溟有鱼QAQ北溟有鱼QAQ

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= %s\n",$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=%s\n",$pid);

执行服务端代码php demo29.php,通过ls命令可以看到已经生成文件,并且通过file命令可以看到生成的文件是一个socket文件,通过pstree -ap 查看启动的进程id,通过strace命令监控服务端进程

通过上面的执行结果可以看到,进程之间是可以进行通信的

注意:切记要自行处理生成的socket文件,否则会报address呗占用的错误

本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unix套接字通信之Udp
    • tcp和udp的区别
      • 服务端代码示例
        • 客户端代码示例
          • 注意:切记要自行处理生成的socket文件,否则会报address呗占用的错误
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档