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

智能推荐

GoldenGate -1> oracle 12c RAC to Single Instance 数据同步_12c rac ogg同步_saytel的博客-程序员宝宝

SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.AL32UTF8SQL>--linux:orapwd file=/oracle/app/oracle/p

_stdcall与_cdecl_万人往372的博客-程序员宝宝

在函数调用过程中,_stdcall与_cdecl是两种不同的函数调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数将参数弹出栈,以及产生函数修饰名的方法。_stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。   Win32的API函数都遵循_stdcall调用约定。在vc++开发环境中,默认的编译选项是_cdecl,对于那

ASA 8.42 in VMware Workstation_net sec的博客-程序员宝宝

Here are all related ASA(v) posts in this blog:ASA 8.02 in Vmware WorkstationASA 8.42 in VMware WorkstationASA 9.21 in Vmware Workstation 10Cisco ASAv 9.4.1 and ASDM 7.4.1 in Workstation / ESXi ...

java nio so_backlog_TCP的连接队列与backlog参数_weixin_39831039的博客-程序员宝宝

在Netty中经常会看到这样的代码:ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024).childHandler(new ChildChannelHa...

afl中llvm_mode下的afl-llvm-pass.so.cc源码解析_acnowa的博客-程序员宝宝

菜鸟入门,如有任何不当之处,烦请各位路过的大佬指正,不胜感激!首先在匿名的命名空间中,定义一个继承自ModulePass的AFLCoverage类。而对于ModulePass的理解我们可以参考官网对其的介绍:The ModulePass class is the most general of all superclasses that you can use. Deriving from ModulePass indicates that your pass uses the entire prog

感悟线上分享_bisal(Chen Liu)的博客-程序员宝宝

上周五,做了一次线上的技术分享《技术分享邀请》,因为疫情,这种线上的会越来越成熟了,腾讯会议、WebEX,都为工作形式提供了更多的可能。线上是很方便,主要是省了现场开会的时间成本,电脑、手...

随便推点

C#:winform使用chart控件绘制折线图,时间轴可缩放_BigSmallpipi的博客-程序员宝宝

最近做的一个项目里用到这部分打算记录下来挖个坑

navicat创建表不显示问题解决_数据库中创建表后没有显示_焦糖布丁.的博客-程序员宝宝

在创建数据表时,我们会发现navicat创建表不显示问题?以下有三种解决方法!

Navicat连接oracle可能会遇到的问题_cheshuo1944的博客-程序员宝宝

前言:navicat可以连接大部分关系型数据库,因为其轻量和汉化,深受我的喜爱,pl/sql固然有它的长处,但是我就是喜欢用navicat,在navicat连接oracle的过程中,曾经出现过一些小问题,我把这个过程整理出来,以防今后遇到了相同问题又去到处搜索。 1、打开navicat pr...

MFC DLL 资源模块句柄切换_mfc dll 资源句柄_zougangx的博客-程序员宝宝

以前写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE(AfxGetStaticModuleState())。一直不明白这样做的含义,也一直没有这样做,而且代码也工作得好好的,所以感觉这好像一句废话。最近的项目中,需要在DLL里使用MFC生成界面,这才发现一旦资源放在不同的动态库里,而且还和多线程搅和在一

Elasticsearch 聚合性能优化六大猛招_eager_global_ordinals_铭毅天下的博客-程序员宝宝

1、问题引出默认情况下,Elasticsearch 已针对大多数用例进行了优化,确保在写入性能和查询性能之间取得平衡。我们将介绍一些聚合性能优化的可配置参数,其中部分改进是以牺牲写入性能...

024-JVM-自定义类加载器_jvm 自定义类加载器_前路无畏的博客-程序员宝宝

上一篇:023-JVM-类加载器源码分析https://yuhongliang.blog.csdn.net/article/details/111566920分析完源码,下面自定义类加载器。1. 把编译后的Miao.class放在D:\tmp\jvm目录下2. 代码实现,及分析package com.yuhl.c2020;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStre

推荐文章

热门文章

相关标签