Linux Unix域套接字-程序员宅基地

技术标签: Linux  Unix域套接字  socketpair  

套接字API多用于网络通信,用于不同主机间进行通信,虽然也可以用于同一主机进程间通信,但是没有Unix域套接字效率高。Unix域套接字用于同一主机进程间通信(即单个主机上客户/服务器通信),提供两种套接字类型字节流套接字(类似TCP)和数据报套接字(类似UDP)。

1、Unix域套接字结构

#include <sys/un.h>
struct sockaddr_un{
    sa_family_t sun_family;   /*AF_LOCAL*/
    char sun_path[108];       /*null terminated pathname*/
};
/* 说明:
 * sun_family 为套接字家族,为AF_LOCAL,也可以是AF_UNIX;
 * sun_path[108]为保存路径的数组,大小也可能是104,由系统决定,路径由空字符结束;
 * 空字符(sun_path[0]=0)表示未指定地址,等价于IPv4中的INADDR_ANY;
 * 用于获取结构长度的宏:SUN_LEN(&str),参数为该结构的一个指针,返回的是实际的数据长度,不包含空字节;
 */

Unix域套接字应用类似网络套接字,都是通过socket函数来获取一个套接字描述符。简单应用如下:

#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int sockfd;
    socklen_t len;
    struct sockaddr_un addr1, addr2;
    char path[] = "/home/centos/tsdir";

    unlink(path);  //delete file
    sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
    bzero(&addr1, sizeof(addr1));
    addr1.sun_family = AF_LOCAL;
    strncpy(addr1.sun_path, path, sizeof(addr1.sun_path)-1);
    //memcpy(addr1.sun_path, path, sizeof(path));
    bind(sockfd, (struct sockaddr*) &addr1, SUN_LEN(&addr1));

    len = sizeof(addr2);
    getsockname(sockfd, (struct sockaddr*) &addr2, &len);
    printf("bound name = %s, returned len = %d\n", addr2.sun_path, len);
    exit(0);
}

代码中创建一个Unix域套接字,由bind函数绑定到由socket函数获取的描述符上,套接字的地址为本地的一个路径名,利用getsockname得到并输出地址。
unlink用于删除路径名,以防止它已存在;
strncpy用于复制路径到相应位置,注释的memcpy功能相同;
路径名必须是绝对路径;
对于UDP来说,客户端套接字必须绑定一个路径名,以使UDP服务器有发送应答的目的地;

2、socketpair 函数

/* 功能:创建两个连接起来的套接字,仅适用于Unix域套接字;
 * 返回值:成功则为0,出错则为-1;
 * 定义:
 */
#include <sys/socket.h>
int socketpair(int family, int type, int protocol, int sockfd[2]);
/* 说明:
 * family 参数必须为AF_LOCAL;
 * protocol 必须为0;
 * type 可以是SOCK_STREAM,SOCK_DGRAM;
 * sockfd 存储新建的两个描述符;
 * 两个描述符既可读又可写;
 */

UNIX域套接字编程和socketpair 函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ahafg/article/details/53022809

智能推荐

二阶sql注入里面隐藏了一些东西-程序员宅基地

文章浏览阅读433次。Summary : 总结: Everyone knows what is SQL Injection, but just to give you a brief about SQL Injection, it is a code injection technique that might destroy your database. It usually occurs when you ask...

swift 中隐藏导航栏_在Swift中隐藏和显示导航栏和标签栏-程序员宅基地

文章浏览阅读3k次。swift 中隐藏导航栏Since everyone wants their app to look neat, attractive, and fascinating, non-standard UI elements and animations are becoming very popular. HidingNavigationBar is such a framework. It hel...

【2021-12-18】java.lang.reflect.InaccessibleObjectException: Unable to make protected void java.util.R_unable to make protected void java.util.resourcebu-程序员宅基地

文章浏览阅读4.7k次。java.lang.reflect.InaccessibleObjectException: Unable to make protected void java.util.ResourceBundle.setParent(java.util.ResourceBundle) accessible: module java.base does not “opens java.util” to unnamed module @a38d7a3在项目级的 build.gradle 的 buildscript 的 _unable to make protected void java.util.resourcebundle.setparent(java.util.r

ubuntu16.04 安装apache php5 mysql & 相关设置_ubuntu16 php5-mysql-程序员宅基地

文章浏览阅读5.3k次。ubuntu16.04下默认安装的是php7,由于想要换成主流的php5,所以就有了此文。可能遇到的报错:Fatal error: Call to undefined function mysql_connect()_ubuntu16 php5-mysql

成像系统的高级PSF及MTF计算_matlab psf mtf-程序员宅基地

本题要求计算A−B,即从字符串A中删除字符串B所包含的字符,返回剩下的字符组成的字符串A−B。

R语言使用矩阵操作回归分析_gwas012编码-程序员宅基地

文章浏览阅读5.7k次,点赞9次,收藏25次。用矩阵的方法计算回归分析参数1.1 数据来源:来源R语言默认的数据集women这是一个描述女性身高和体重的数据,我们以height为X变量(自变量),以weight为Y变量(因变量),进行模型的计算。 计算方法参考:https://stats.idre.ucla.edu/r/library/r-library-matrices-and-matrix-computations-in-r/1.2_gwas012编码

随便推点

《华为C&C++语言安全规范》笔记_华为 c&c++ 语言安全编程规范-程序员宅基地

文章浏览阅读7.5k次,点赞9次,收藏59次。《华为C&C++语言安全规范》笔记通过阅读《华为C&C++语言安全规范》1,我了解到了我在编程中很多缺失的部分。现在记录下几个要点:规则1.1.4:严禁对指针变量进行sizeof操作编码人员往往由于粗心,将指针当做数组进行sizeof操作,导致实际的执行结果与预期不符。 下面的代码,buffer和path分别是指针和数组,编码人员想对这2个内存进行清0操作,但由于编码人员的疏忽,第5行代码,将内存大小误写成了sizeof,与预期不符。如果要判断当前的指针类型大小,请使用sizeof_华为 c&c++ 语言安全编程规范

织梦html5博客模板,HTML5响应式清爽博客文章织梦模板 v1.0-程序员宅基地

文章浏览阅读260次。HTML5响应式清爽博客文章织梦模板简介HTML5响应式清爽博客文章织梦模板是一个自适应手机端和PC端的最新版织梦V5.7为内核的网站模板,软件兼容主流浏览器,模板包含安装说明,并包含测试数据。dedecms最新版内核开发,原创设计、手工书写DIV+CSS,完美兼容IE7+、Firefox、Chrome、360浏览器等;主流浏览器;页面简洁简单,容易管理,DEDE内核都可以使用;附带测试数据!模板..._html5个人博客新闻资讯自适应织梦模板

ASP.NET2.0 TreeView的数据库绑定-程序员宅基地

文章浏览阅读96次。<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1..._asp.net treeview 怎么绑定数据源

librosa实现音频格式转换(单曲&批量) | MP3转wav_librosa 保存mp3-程序员宅基地

文章浏览阅读2.6k次,点赞5次,收藏15次。文章目录step1:环境要求①安装ffmpeg②安装librosa③安装soundfilestep2:4行代码完成转换①导包②读入需要处理的MP3文件③用soundfile重写成wav综上,完整代码如下:step1:环境要求①安装ffmpeg这一步很关键。如果没有ffmpeg,librosa读取MP3文件时就会报错。见笔者的文章:ffmpeg安装②安装librosapip install librosa③安装soundfilepip install soundfilestep2:4_librosa 保存mp3

php深度克隆对象,js对象深度克隆实例详解-程序员宅基地

文章浏览阅读53次。克隆对象在开发过程中经常会遇到,有些时候需要浅克隆,有些时候需要深克隆,本文主要和大家分享js对象深度克隆实例详解,希望能帮助到大家。// 深度克隆function deepClone(origin, target) {var target = target || {};for (var prop in origin) {if (origin.hasOwnProperty(prop)) {if (..._for(var prop in orign)

磁珠 符号_磁珠基础知识大全,如何选择磁珠-程序员宅基地

文章浏览阅读384次。一、什么是磁珠?磁珠有很高的电阻率和磁导率,他等效于电阻和电感串联,但电阻值和电感值都随频率变化。 他比普通的电感有更好的高频滤波特性,在高频时呈现阻性,所以能在相当宽的频率范围内保持较高的阻抗,从而提高调频滤波效果。作为电源滤波,可以使用电感。磁珠的电路符号就是电感但是型号上可以看出使用的是磁珠在电路功能上,磁珠和电感是原理相同的,只是频率特性不同罢了。磁珠由氧磁体组成,电感由磁心和线圈组成,磁..._磁珠的在pads查找首写字母rt吗