UNIX网络编程读书笔记:UNIX域协议
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了UNIX网络编程读书笔记:UNIX域协议,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3011字,纯文字阅读大概需要5分钟。
内容图文
![UNIX网络编程读书笔记:UNIX域协议](/upload/InfoBanner/zyjiaocheng/1095/41ebe05c61cc480488eaed0bfedbf432.jpg)
概述
UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法 ,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同。UNIX域协议可视为进程间通信(IPC)方法之一。
UNIX域提供两类套接口:字节流套接口(类似TCP)和数据报套接口(类似UDP)。
使用UNIX域套接口的理由有3个:
UNIX域中用于标识客户和服务器的协议地址是普通文件系统中的路径名。 这些路径名不是普通的UNIX文件:除非把它们和UNIX域套接口关联起来,否则无法读写这些文件。
UNIX域套接口地址结构
在头文件<sys/un.h>中定义了UNIX域套接口地址结构:
struct sockaddr_un { sa_family_t sun_family; /* AF_LOCAL */ char sun_path[104]; /* null-terminated pathname */ };
存放在sun_path数组中的路径名必须以空格字符结尾。
实现提供的SUN_LEN宏以一个指向sockaddr_un结构的指针为参数并返回该结构的长度,其中包括路径名中非空字节数。
未指定地址(通配地址),通过以空字符串作为路径名指示,也就是一个sun_path[0]值为0的地址结构。这是UNIX域中与IPv4的INADDR_ANY常值以及IPv6的IN6ADDR_ANY_INIT常值等价的一个地址。
POSIX把UNIX域协议重新命名为“本地IPC”,以消除它对于UNIX操作系统的依赖。历史性的AF_UNIX常值变为AF_LOCAL。尽管POSIX努力使它独立于操作系统,它的套接口地址结构仍然保留_un后缀。
创建一个UNIX域套接口,往其上bind一个路径名,再调用getsockname输出这个绑定的路径名。
#include <sys/un.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char **argv) { int sockfd; socklen_t len; struct sockaddr_un addr1, addr2; if(argc != 2) { printf("usage: unixbind <pathname> "); exit(0); } sockfd = socket(AF_LOCAL, SOCK_STREAM, 0); unlink(argv[1]); /* 如果文件系统中已存在该路径名,bind将会失败。为此我们先调用unlink删除这个路径名,以防止它已经存在。 */ bzero(&addr1, sizeof(addr1)); addr1.sun_family = AF_LOCAL; strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path) - 1); 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); }
运行结果如下:
socketpair函数
socketpair函数创建两个随后连接起来的套接口。本函数仅适用于UNIX域套接口。
#include <sys/socket.h> int socketpair(int family, int type, int protocol, int sockfd[2]); 返回:0——成功,-1——出错
family参数必须为AF_LOCAL;
protocol参数必须为0;
type参数可以是SOCK_STREAM,也可以是SOCK_DGRAM。
新创建的两个套接口描述字作为sockfd[0]和sockfd[1]返回。
本函数类似于UNIX的pipe函数:返回两个彼此连接的描述字。事实上,源自berkeley的实现通过执行与socketpair一样的内部操作给出pipe接口。
这样创建的两个套接口不曾命名;也就是说其中没有涉及隐式的bind调用。它与调用pipe创建的普通UNIX管道类似,差别在于流管道是全双工的,即两个描述字都是既可读又可写。
POSIX不要求全双工管道。
套接口函数
当用于UNIX域套接口时,套接口函数中存在一些差异和限制:
未完待续。。。
原文:http://www.cnblogs.com/nufangrensheng/p/3595610.html
内容总结
以上是互联网集市为您收集整理的UNIX网络编程读书笔记:UNIX域协议全部内容,希望文章能够帮你解决UNIX网络编程读书笔记:UNIX域协议所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。