格式化抽象本地地址
传统AF_UNIX套接口名字的麻烦之一就在于总是调用文件系统对象。这不是必须的,而且也不方便。如果原始的文件系统对象并没有删除,而在bind调用时使用相同的文件名,名字赋值就会失败。
Linux 2.2内核使得为本地套接口创建一个抽象名了成为可能。他的方法就是使得路径名的第一个字节为一个空字节。在路径名中空字节之后的字节才会成为抽象名字的一部分。下面的这个程序是上一个例子程序的修改版本。这个程序采用了一些不同的方法来创建一个抽象的名字。
/***************************************** 
 * af_unix2.c
 *
 * AF_UNIXSocket Example
 * CreateAbstract Named AF_UNIX/AF_LOCAL
 *******************************************/ 
#include<stdio.h>
#include<stdlib.h>
#include<error.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<sys/un.h>

/*
 * Thisfunction reports the error and 
 * exits backto the shell:
 */
static voidbail(const char *on_what)
{
   perror(on_what);
   exit(1);
}

int main(intargc,char **argv,char **envp)
{
   int z;        /* Status return code */
   int sck_unix;    /* Socket */
   struct sockaddr_un adr_unix;    /* AF_UNIX */
   int len_unix;    /* length */
   const char pth_unix[]    /* Abs .Name */
       = "Z*MY-SOCKET*";

/*
    * Create an AF_UNIX (aka AF_UNIX) socket:
    */
   sck_unix = socket(AF_UNIX,SOCK_STREAM,0);
   if(sck_unix == -1)
       bail("socket()");

/* 
    * Form an AF_UNIX Address
    */
   memset(&adr_unix,0,sizeof adr_unix);
   adr_unix.sun_family = AF_UNIX;
   strncpy(adr_unix.sun_path,pth_unix,
           sizeof adr_unix.sun_path-1)
       [sizeof adr_unix.sun_path-1] = 0;
   len_unix = SUN_LEN(&adr_unix);

/*
    * Now make first byte null
    */
   adr_unix.sun_path[0] = 0;
    
   z = bind(sck_unix,(struct sockaddr *)&adr_unix,len_unix);
   if(z == -1)
       bail("bind()");
   /*
    * Display all of our bound sockets:
    */
   system("netstat -pa --unix 2>/dev/null |"
           "sed -n '/^Active UNIX/,/^Proto/P;"
           "/af_unix/P'");
   /*
    * Close and unlink our socket path:
    */
   close(sck_unix);
   return 0;
   /*
    * Now bind the address to the socket:
    */
}
这个程序的运行结果如下:
$ ./af_unix2
Active UNIX domainsockets (servers and established)
Proto RefCntFlags    Type     State I-Node PID/Programname Path
unix0       []      STREAM         1041435186/af_unix2    @*MY- SOCKET*
$
从这个输出结果中我们可以看到,套接口地址是以 @*MYSOCKET*的名字出现的。开头的@标志是为netstat命令用来标识抽象UNIX套接口名字。其余的字符是拷贝到字符数组剩余位置的字符。注意@字符出现在我们的Z字符应出现的地方。
整个程序的步骤与前一个程序的相同。然而,地址的初始化步骤有一些不同。这些步骤描述如下:
1 在第31行和第32行定义了套接口抽象名字的字符串。注意字符串的第一个字符为Z。在这个字符串这个多余的字符只是起到占位的作用,因为实际上他会在第6步被一个空字节代替。
2 在第45行通过调用memset函数将整个结构初始经为0。
3 在第47行将地址族设置为AF_UNIX。
4 在第49行使用strncpy函数将抽象名字拷贝到adr_unix.sun_path中。在这里要注意,为了SUN_LEN()宏的使用在目的字符数组的放置了一个结束的空字节。否则就不需要这个结束的空字节。
5 在第53通过Linux所提供的SUN_LEN() C 宏来计算地址的长度。这个宏会在sun_path[]上调用strlen函数,所以需要提供了一个结束字符。
6 这一步是新的:sun_path[]数组的第一个字节被设置为空字节。如果使用SUN_LEN()宏,必须最后执行这一步。
在这一部分,我们了解了如何来创建AF_LOCAL和AF_UNIX的套接口地址。为了计算套接口地址的长度,我们使用SUN_LEN()宏。然而,当计算抽象套接口名字时,我们要十分注意。

格式化抽象本地地址(实战linux socket编程)的更多相关文章

  1. Linux socket 编程中存在的五个隐患

    前言:         Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是   开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示如何避免它 ...

  2. Linux Socket 编程简介

    在 TCP/IP 协议中,"IP地址 + TCP或UDP端口号" 可以唯一标识网络通讯中的一个进程,"IP地址+端口号" 就称为 socket.本文以一个简单的 ...

  3. Linux Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  4. Linux Socket编程(不限Linux)【转】

    转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...

  5. Linux Socket编程(不限Linux)

    "一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...

  6. Socket详解-Linux Socket编程(不限Linux)

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  7. Windows Socket和Linux Socket编程的区别 ZZ

    socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h ...

  8. Linux socket编程示例(最简单的TCP和UDP两个例子)

    一.socket编程 网络功能是Uinux/Linux的一个重要特点,有着悠久的历史,因此有一个非常固定的编程套路. 基于TCP的网络编程: 基于连接, 在交互过程中, 服务器和客户端要保持连接, 不 ...

  9. Linux Socket编程-(转自吴秦(Tyler))

    "一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...

随机推荐

  1. Java技术专区-虚拟机系列-虚拟机参数(常用)

    基础参数系类(内存分配) -server:一定要作为第一个参数,在多个CPU时性能佳 -Xmn:young generation的heap大小,一般设置为Xmx的3.4分之一-Xms:初始Heap大小 ...

  2. 获取图片地址url的后缀名

    getNameFromLink(url){ if(url.indexOf('.cn/') !== -1){          return (url.split('.')[url.split('.') ...

  3. url传送图片的base64编码给web客户端

    base64编码图片: #python3.6 import base64 with open("./aa.jpg", "rb") as f: data = ba ...

  4. 使用androidstudio时遇到的一些小错误

    1 路径名字中不能有汉字  报如下错误:Error:(1, 0) Your project path contains non-ASCII characters. This will most lik ...

  5. KiCAD输出生产文件

    KiCAD输出生产文件 本文包括PCB生产制造的所有文件的输出方法,包括:BOM.坐标.锡膏层.GERBER.钻孔.丝印和装配图 一.KiCAD导出BOM KiCAD导出BOM有以下几种办法: 注意: ...

  6. mysql 判断指定条件数据存不存在,不存在则插入

    折腾了半天终于把这个给折腾顺了,但是后来发现用不了竟然...悲剧啊,但是还是要记录下加深记忆 insert into table1 (field1, field2,field3) select ?fi ...

  7. jQuery随机抽取数字号代码

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  8. 5、Python 基础类型 -- Dictionary 字典类型

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...

  9. 关于linux centos7 vmware 和windows7 文件共享笔记

    本方法是以win7,VMware9.0.1 ,centos6.4为基础实验的. 对于linux的初级使用阶段,都会Windows中使用linux虚拟机VMWare或者其它的.在Windows与linu ...

  10. Delphi实现获取句柄并发送消息的方法(FindWindow、FindWindowEx、EnumChildWindows、SendMessage)

    Delphi实现获取句柄并发送消息的方法 本文以实例形式详细说明了Delphi获取句柄并发送消息的方法,具体用法说明如下: 查找另外一个窗口的句柄: handle := FindWindow(nil, ...