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即可
效果如图 :
相关推荐
然而,对于在同一台机器上运行的进程间通信(IPC),UNIX域套接字(AF_UNIX或SOCK_UNIX)提供了高效、低开销的解决方案。jnr-unixsocket是Java的一个库,它允许Java应用程序利用UNIX域套接字进行本地通信。本文将...
在本程序中,服务器和客户端通过UNIX域协议建立连接,使用`socket(AF_UNIX, SOCK_STREAM, 0)`创建套接字,并通过`bind()`函数绑定到特定的文件路径,如"server_socket"。 3. **套接字编程**:服务器端首先创建一个...
Unix域套接字(AF_UNIX或AF_LOCAL)是Unix和类Unix系统中一种特殊类型的套接字,它们允许同一台计算机上的进程间通信(IPC)。与TCP/IP套接字不同,Unix域套接字不涉及网络传输,而是通过文件系统路径名来定位对等...
Socket是BDS UNIX进程间通信(IPC)的一种方式,它允许不同进程之间进行信息交互。一个Socket通常也称为“套接字”,用于标识IP地址和端口号,是通信链路的句柄。程序通过Socket向网络发送请求或响应网络请求。 在...
- **AF_UNIX(Unix内部协议)**:主要用于同一台计算机上的进程间通信(IPC),提供了高效的本地通信机制。 - **AF_INET(Internet协议)**:这是最常用的协议族,支持基于IPv4的网络通信。 - **AF_NS(XeroxNS协议...
在Linux操作系统中,Socket通信是一种广泛使用的进程间通信(IPC,Inter-Process Communication)方式,不仅应用于网络通信,还常用于同一台机器上的本地进程间通信。本篇将深入探讨"Linux 本地Socket通讯"这一主题...
在计算机网络编程中,Socket是一种通信接口,允许应用程序通过网络进行通信。Socket基于标准Unix文件描述符,它提供了一种通用的方式来实现进程间通信(IPC)。在Unix系统中,一切皆文件,文件描述符是一个整数值,...
在Linux操作系统中,网络编程是实现跨机器通信的关键技术,主要通过套接字(Sockets)接口来实现。本文将详细解析"Linux-socket.tar.gz"压缩包中的知识点,包括Unix/Linux环境下的网络编程基础、TCP与UDP协议的使用...
在Unix系统中,socket是一种通信接口,它使用文件描述符作为标识符,允许进程间通信(IPC)。就像文件描述符可以代表文件、管道或终端一样,它也可以代表网络连接。当你创建一个socket时,系统会返回一个唯一的整数...
** 套接字是一种使用文件描述符进行通信的机制,它可以代表网络连接、管道、FIFO等。在Unix系统中,一切皆文件,包括网络通信。socket()函数用于创建套接字,返回的套接字描述符用于后续的send()和recv()调用,尽管...
套接字是Unix系统中用于进程间通信(IPC)的一种机制,它使用文件描述符作为标识,允许程序通过网络与其他程序交换数据。套接字可以是网络连接,也可以是其他类型的通信通道,如管道、FIFO等。 2) **Internet套接字...
Linux域套接字(也称为Unix域套接字或本地域套接字)是进程间通信(IPC,Inter-Process Communication)的一种方式,特别适用于在同一台计算机上的不同进程之间进行高效的数据交换。与网络套接字(如TCP或UDP)不同...
**进程间Socket通信**,主要利用Unix Domain Socket(UDS),这是一种特殊类型的Socket,用于在同一主机上的不同进程间进行通信,类似于管道和消息队列。创建UDS的基本步骤: 1. 同样引入必要的头文件。 2. 使用`...
1. `socket_unix`:这个文件可能是实现域套接字通信的C语言源代码,其中可能包含了创建、绑定、监听和接受连接等面向连接的域套接字操作。通常,代码会使用`socket()`函数创建套接字,`bind()`函数将套接字与本地...
通过这样的方式,Java开发者可以方便地利用Unix Domain Socket进行高效的本地进程间通信,而无需深入学习C语言或JNI。这使得Java应用程序能够充分利用操作系统提供的本地功能,同时保持Java的跨平台特性。在...
地址类型中提到了AF_UNIX和AF_INET,它们分别代表本地和网络通讯。而Socket类型介绍了SOCK_STREAM和SOCK_DGRAM,分别对应TCP和UDP协议。协议参数通常设置为0,表示使用默认协议。 接着,文章讨论了客户端如何发起...
Socket是一种编程接口,它允许两个运行在网络上的程序通过网络进行通信。Socket可以看作是网络上的端点,数据通过Socket在进程之间流动。在Unix-like系统中,包括Linux,Socket是实现IPC的一种方式,与其他如管道、...
Socket,通常称为套接字,是网络通信中的接口,它提供了一种标准的方法来实现进程间的通信(IPC)以及不同网络间的通信。Socket API 是跨平台的,可以在多种操作系统上使用,包括Unix系统。 **Socket类型** Socket...
在创建套接字时,需要指定协议族(如AF_INET表示IPv4,AF_INET6表示IPv6),以及地址族(如PF_UNIX用于本地进程间通信,PF_INET用于Internet通信)。 3. **网络字节序** 网络字节序是大端字节序,也称为网络标准...