`
hyjiang1989
  • 浏览: 102149 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

php与C语言通过AF_UNIX来进行IPC通信的例子

阅读更多

php与C语言通过AF_UNIX来进行IPC通信的例子

1)编写s_unix.c服务端文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> 
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
    socklen_t clt_addr_len;
    int listen_fd;
    int com_fd;
    int ret;
    int i;
    static char recv_buf[1024]; 
    int len;
    struct sockaddr_un clt_addr;
    struct sockaddr_un srv_addr;
    listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
    if(listen_fd<0)
    {
        perror("cannot create communication socket");
        return 1;
    }  
    
    //set server addr_param
    srv_addr.sun_family=AF_UNIX;
    strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
    unlink(UNIX_DOMAIN);
    //bind sockfd & addr
    ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
    if(ret==-1)
    {
        perror("cannot bind server socket");
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 1;
    }
    //listen sockfd 
    ret=listen(listen_fd,1);
    if(ret==-1)
    {
        perror("cannot listen the client connect request");
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 1;
    }
    //have connect request use accept
    len=sizeof(clt_addr);
    com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
    if(com_fd<0)
    {
        perror("cannot accept client connect request");
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 1;
    }
    //read and printf sent client info
    printf("/n=====info=====/n");
    for(i=0;i<4;i++)
    {
       memset(recv_buf,0,1024);
       int num=read(com_fd,recv_buf,sizeof(recv_buf));
	//printf("num=%d/n",num);
       printf("Message from client (%d)) :%s/n",num,recv_buf);
	//printf("i=%d/n",i);
	write(com_fd,"hello world",11,0);
	printf("/n%s/n","server to client msg ok");
    }
   // write(com_fd,"hello world",11,0);
   // printf("/n%s/n","server to client msg ok");
//printf("%s/n","end");
    //write(listen_fd,"aaadfd",6,0);
    close(com_fd);
    close(listen_fd);
    unlink(UNIX_DOMAIN);
    return 0;
}

 2)编写c_unix.c客户端文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
    int connect_fd;
    int ret;
    char snd_buf[1024];
    int i;
    static struct sockaddr_un srv_addr;
//creat unix socket
    connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
    if(connect_fd<0)
    {
        perror("cannot create communication socket");
        return 1;
    }   
    srv_addr.sun_family=AF_UNIX;
    strcpy(srv_addr.sun_path,UNIX_DOMAIN);
//connect server
    ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
    if(ret==-1)
    {
        perror("cannot connect to the server");
        close(connect_fd);
        return 1;
    }
    memset(snd_buf,0,1024);
    strcpy(snd_buf,"message from client");
//send info server
    for(i=0;i<4;i++)
        write(connect_fd,snd_buf,sizeof(snd_buf));
    close(connect_fd);
    return 0;
}

 3)编写PHP客户端文件 test.php

<?php
 define("UNIX_DOMAIN","/tmp/UNIX.domain");
// echo UNIX_DOMAIN;
  
 $socket = socket_create(AF_UNIX, SOCK_STREAM, 0);  //第三个参数为0
 if ($socket < 0) 
 { 
      echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; 
 } 
 else

 { 
      echo "create OK.\n"; 
 }  
   
  $result = socket_connect($socket, UNIX_DOMAIN);  //这里只要两个参数即可
 if ($result < 0) 
 { 
      echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; 
 } 
 else

 { 
      echo "connect OK"; 
 }
   
  //下面的代码和普通php socket通信一致
 $in = "测试IPC通信\n";     
 if(!socket_write($socket, $in, strlen($in))) 
 { 
      echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; 
 } 
 else

 { 
      echo "send message ok!\n";  
      echo "\naccept message=".socket_read($socket, 8192)."\n";
 }  
 
 
 echo "Close SOCKET...\n"; 
 socket_close($socket); 
 echo "Close OK\n"; 
 
?>

 4)编译s_unix.c和c_unix.c文件

gcc s_unix.c -o s_unix

gcc c_unix.c -o c_unix

5)运行测试

先启动一个窗口运行s_unix,方法 为:./s_unix

然后 再开启一个窗口运行c_unix进行测试 :./c_unix

这里主要是来测试 PHP与C语言的通信  可以再开启一个窗口运行php test.php即可

效果如图 :

 

 

  • 大小: 56.2 KB
分享到:
评论

相关推荐

    jnr-unixsocket:适用于Java的UNIX域套接字(AF_UNIX)

    然而,对于在同一台机器上运行的进程间通信(IPC),UNIX域套接字(AF_UNIX或SOCK_UNIX)提供了高效、低开销的解决方案。jnr-unixsocket是Java的一个库,它允许Java应用程序利用UNIX域套接字进行本地通信。本文将...

    Linux下C语言多线程,网络通信简单聊天程序

    在本程序中,服务器和客户端通过UNIX域协议建立连接,使用`socket(AF_UNIX, SOCK_STREAM, 0)`创建套接字,并通过`bind()`函数绑定到特定的文件路径,如"server_socket"。 3. **套接字编程**:服务器端首先创建一个...

    garbage.rar_网络编程_Unix_Linux_

    Unix域套接字(AF_UNIX或AF_LOCAL)是Unix和类Unix系统中一种特殊类型的套接字,它们允许同一台计算机上的进程间通信(IPC)。与TCP/IP套接字不同,Unix域套接字不涉及网络传输,而是通过文件系统路径名来定位对等...

    c语言编程-socket基础

    Socket是BDS UNIX进程间通信(IPC)的一种方式,它允许不同进程之间进行信息交互。一个Socket通常也称为“套接字”,用于标识IP地址和端口号,是通信链路的句柄。程序通过Socket向网络发送请求或响应网络请求。 在...

    C语言之Socket

    - **AF_UNIX(Unix内部协议)**:主要用于同一台计算机上的进程间通信(IPC),提供了高效的本地通信机制。 - **AF_INET(Internet协议)**:这是最常用的协议族,支持基于IPv4的网络通信。 - **AF_NS(XeroxNS协议...

    Linux 本地Socket通讯

    在Linux操作系统中,Socket通信是一种广泛使用的进程间通信(IPC,Inter-Process Communication)方式,不仅应用于网络通信,还常用于同一台机器上的本地进程间通信。本篇将深入探讨"Linux 本地Socket通讯"这一主题...

    c语言socket编程指南

    在计算机网络编程中,Socket是一种通信接口,允许应用程序通过网络进行通信。Socket基于标准Unix文件描述符,它提供了一种通用的方式来实现进程间通信(IPC)。在Unix系统中,一切皆文件,文件描述符是一个整数值,...

    linux-socket.tar.gz_网络_Unix_Linux_

    在Linux操作系统中,网络编程是实现跨机器通信的关键技术,主要通过套接字(Sockets)接口来实现。本文将详细解析"Linux-socket.tar.gz"压缩包中的知识点,包括Unix/Linux环境下的网络编程基础、TCP与UDP协议的使用...

    C语言socket编程指南

    在Unix系统中,socket是一种通信接口,它使用文件描述符作为标识符,允许进程间通信(IPC)。就像文件描述符可以代表文件、管道或终端一样,它也可以代表网络连接。当你创建一个socket时,系统会返回一个唯一的整数...

    C语言SOCKET编程经典指南.doc

    ** 套接字是一种使用文件描述符进行通信的机制,它可以代表网络连接、管道、FIFO等。在Unix系统中,一切皆文件,包括网络通信。socket()函数用于创建套接字,返回的套接字描述符用于后续的send()和recv()调用,尽管...

    c语言SOCKEt编程指南 .doc

    套接字是Unix系统中用于进程间通信(IPC)的一种机制,它使用文件描述符作为标识,允许程序通过网络与其他程序交换数据。套接字可以是网络连接,也可以是其他类型的通信通道,如管道、FIFO等。 2) **Internet套接字...

    Linux domain sockets 编程.rar_Sockets_linux_linux domain sock_sock

    Linux域套接字(也称为Unix域套接字或本地域套接字)是进程间通信(IPC,Inter-Process Communication)的一种方式,特别适用于在同一台计算机上的不同进程之间进行高效的数据交换。与网络套接字(如TCP或UDP)不同...

    linux下socket编程

    **进程间Socket通信**,主要利用Unix Domain Socket(UDS),这是一种特殊类型的Socket,用于在同一主机上的不同进程间进行通信,类似于管道和消息队列。创建UDS的基本步骤: 1. 同样引入必要的头文件。 2. 使用`...

    linux域套接字面向连接和面向非连接的代码

    1. `socket_unix`:这个文件可能是实现域套接字通信的C语言源代码,其中可能包含了创建、绑定、监听和接受连接等面向连接的域套接字操作。通常,代码会使用`socket()`函数创建套接字,`bind()`函数将套接字与本地...

    JNAUnixSocket:修改JUnixSocket项目以在Java中简单地使用Unix Domain Socket

    通过这样的方式,Java开发者可以方便地利用Unix Domain Socket进行高效的本地进程间通信,而无需深入学习C语言或JNI。这使得Java应用程序能够充分利用操作系统提供的本地功能,同时保持Java的跨平台特性。在...

    iPhone网络通讯之BSD Socket篇

    地址类型中提到了AF_UNIX和AF_INET,它们分别代表本地和网络通讯。而Socket类型介绍了SOCK_STREAM和SOCK_DGRAM,分别对应TCP和UDP协议。协议参数通常设置为0,表示使用默认协议。 接着,文章讨论了客户端如何发起...

    Socket完成进程

    Socket是一种编程接口,它允许两个运行在网络上的程序通过网络进行通信。Socket可以看作是网络上的端点,数据通过Socket在进程之间流动。在Unix-like系统中,包括Linux,Socket是实现IPC的一种方式,与其他如管道、...

    socket网上资料

    Socket,通常称为套接字,是网络通信中的接口,它提供了一种标准的方法来实现进程间的通信(IPC)以及不同网络间的通信。Socket API 是跨平台的,可以在多种操作系统上使用,包括Unix系统。 **Socket类型** Socket...

    Linux 网络编程基础

    在创建套接字时,需要指定协议族(如AF_INET表示IPv4,AF_INET6表示IPv6),以及地址族(如PF_UNIX用于本地进程间通信,PF_INET用于Internet通信)。 3. **网络字节序** 网络字节序是大端字节序,也称为网络标准...

Global site tag (gtag.js) - Google Analytics