Chinaunix首页 | 论坛 | 博客
  • 博客访问: 940830
  • 博文数量: 403
  • 博客积分: 27
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-25 22:20
文章分类

全部博文(403)

文章存档

2016年(3)

2015年(16)

2014年(163)

2013年(222)

分类: LINUX

2013-12-20 09:58:16


Linux和UNIX都拥有一个非常实用的工具--UNIX套接字,或称为本地套接字,它可以被用在进程间通讯(IPC)当中。
和UNIX都拥有一个非常实用的工具--UNIX套接字,或称为本地套接字,它可以被用在进程间通讯(IPC)当中。UNIX套接字的运转机制和Internet套接字类似,主要的区别UNIX套接字只能用在一台计算机中,而Internet套接字则可以在不同的计算机之间使用。UNIX套接字定址的方式是作为本地文件系统里的一个文件。

你可能会奇怪为什么要使用UNIX套接字而不使用常规的Internet套接字呢?或许最大的原因就是安全和速度了。无论何时,当你打开任何Internet套接字的时候,你可能就帮远程的黑客打开了入侵之门。

打开套接字

打开UNIX套接字和打开Internet套接字的方法大同小异。你应该使用套接字命令,不过这里你不应该传递PF_INET,而应该传递PF_LOCAL。下面是一个例子:

int fd = -1;
fd = socket(PF_LOCAL, SOCK_DGRAM, 0);

事实上,PF_LOCAL 有很多别名,你可以在套接字命令的页面查找它们。本地套接字的正确通讯类型是SOCK_STREAM和SOCK_DGRAM。本地套接字只支持默认的协议。

套接字命令仅仅创建套接字。要使用它,你必须用约束命令给它约束一个名称。对于本地套接字来说,这个名称就是文件名。对于Internet套接字,约束命令的第2个参数是指向sockaddr_in的指针,而对于本地套接字,这个参数应该是sockaddr_un。sockaddr_un命令有两个成员:sun_family和sun_path。sun_family永远是AF_LOCAL.,而sun_path成员则是本地文件的路径。按照管理,这个文件包含在tmp目录下。因此约束套接字的代码如下所示:

int fd = -1;
int rslt = -1;
int sz = 0;
const char path[] = "/tmp/testsocket";
struct sockaddr_un server;
server.sun_family = AF_LOCAL;
strncpy(server.sun_path, path, strlen(path));
sz = SUN_LEN(server);
fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
rslt = bind(fd, (struct sockaddr*)&server, sz);
if (rslt < 0){
   /*error handling code*/
}

SUN_LEN宏是一个非常不错的,用来计算sockaddr_un结构大小的捷径。

一旦套接字被打开并约束,你就可以把它当描述符来使用。你可以把本地套接字视为使用同样协议的Internet套接字。因此你可以使用标准通讯协议或是自行设计。当客户端处于同一计算机的时候,客户端可以连接到这些套接字。你同样可以使用本地套接字的异步命令。

阅读(661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~