使用Unix域套接字进行跨进程通信

本文介绍了Unix域套接字的概念,强调了其命名特性在跨进程通信中的作用。通过引用《Unix环境高级编程》的内容,阐述了UNIX域套接字的地址结构,并指出在Linux系统中绑定地址时的注意事项。文章还提供了使用命名Unix域套接字的服务器和客户端编程示例,展示了如何建立和维护连接。
摘要由CSDN通过智能技术生成

Unix域套接字简介

《Unix环境高级编程》中对Unix域套接字有如下介绍:

虽然socketpair函数创建相互连接的一对套接字,但是每一个套接字都没有名字。这意味着无关进程不能使用它们。

我们可以命名unix域套接字,并可将其用于告示服务。但是要注意的是,UNXI与套接字使用的地址不同与因特网域套接字。

UNIX域套接字的地址由sockaddr_un结构表示。

在linux2.4.22中,sockaddr_un结构按下列形式定义在有文件

    struct sockaddr_un{
    sa_family_t sun_family; //AF_UNIX
    char sun_path[108]; //pathname
    };

sun_path成员包含一路经名,当我们将一个地址绑定至UNIX域套接字时,系统用该路经名创建一类型为S_IFSOCK文件。该文件仅用于向客户进程告知套接字名字。该文件不能打开,也不能由应用程序用于通信。

如果当我们试图绑定地址时,该文件已经存在,那么bind请求失败。当关闭套接字时,并不自动删除该文件,所以我们必须确保在应用程序终止前,对该文件执行解除链接操作。

服务器进程可以使用标准bind、listen和accept函数,为客户进程安排一个唯一UNIX域连接。客户进程使用connect与服务器进程连接;

服务器进程接受了connect请求后,在服务器进程和客户进程之间就存在了唯一连接。这种风格和因特网套接字的操作很像。

使用命名的Unix域套接字进程编程

示例为使用Unix域套接字实现一个Client-Server交互的功能

Server端代码如下:创建Unix套接字并绑定到 /tmp/test.sock 下进行监听,当有客户端连接时fork出子进程进行处理,子进程负责接收数据并打印到屏幕上:

/******************************************************************************
 * 文件名称:TestUnixSocket.cpp
 * 文件描述:Unix域套接字测试
 * 创建日期:2015-04-02
 * 作    者:casheywen
 ******************************************************************************/

#include <iostream>
using namespace std;
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#define LOG_ERR(fmt, args...) fprintf(stderr, "PID:%d|"fmt"\n", getpid(), ##args)
#define LOG_INFO(fmt, args...) fprintf(stdout, "PID:%d|"fmt"\n", getpid(), ##args)

int CreateUnixSocket(const char *pszPath)
{
    int iFd = socket(AF_UNIX, SOCK_STREAM, 0);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值