<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[Unix域套接字，UNIX域套接字实例。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Mon, 18 Apr 2016 06:17:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	 背景：像unix或linux下的mysql和php-fpm都有一个xxx.sock文件，它是干嘛的呢？可以研究一下它。<br/>&nbsp;&nbsp;管道由于只能实现具有亲缘进程的进程间通信，使用受到了很大的限制，命名管道解决了这一问题。但是，无论是管道还是命名管道，都只能实现单向通信（在只创建一个管道的情况下）。<br/>使用套接字除了可以实现网络间不同主机间的通信外，还可以实现同一主机的不同进程间的通信，且建立的通信是双向的通信。这里所指的使用套接字实现进程间通信，是由将通信域指定为PF_UNIX来实现的。该函数的形式如下：<br/>int socket(int domain, int type, int protocol);<br/>socket函数中的domain参数用于指定通信域，domain参数取PF_UNIX时，表示创建UNIX域的套接字。使用PF＿UNIX域的套接字可以实现同一机器上的不同进程间的通信。<br/>调用bind函数实现了套接字与地址（这里是文件名）的绑定。bind函数的具体信息如下：<br/>int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);<br/>其参数my_addr为指向结构体sockaddr_un的指针，该结构体的定义如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;#define UNIX_PATH_MAX 108<br/>&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_un &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sa_family_t&nbsp;&nbsp;&nbsp;&nbsp; sun_family;&nbsp;&nbsp;&nbsp;&nbsp; /*PF_UNIX或AF_UNIX */<br/>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;sun_path[UNIX_PATH_MAX];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 路径名 */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;<br/>在该结构体中，sun_family为AF_UNIX。sun_path是套接字在文件系统中的路径名。<br/>Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议；它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名，创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开，而且应该使用套接字API对它进行操作。<br/>Unix域套接字是面向连接的，每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接，但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。<br/><br/>server.c<br/><textarea name="code" class="C" rows="15" cols="100">
/* ************************************************************************
 *&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Filename:&nbsp;&nbsp;recv.c
 *&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;Description:&nbsp;&nbsp;
 *&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version:&nbsp;&nbsp;1.0
 *&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Created:&nbsp;&nbsp;2011年12月03日 20时52分08秒
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Revision:&nbsp;&nbsp;none
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compiler:&nbsp;&nbsp;gcc
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Author:&nbsp;&nbsp;YOUR NAME (), 
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Company:&nbsp;&nbsp;
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* ************************************************************************/
 
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;sys/un.h&gt;
 
#define PATH &quot;/data/codesdev/testdemo/sock/server.sock&quot;
 
int main(int argc ,char *argv[])
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;int sockfd = 0;
&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_un addr;
&nbsp;&nbsp;&nbsp;&nbsp;unlink(PATH);&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;addr.sun_family = AF_UNIX;
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(addr.sun_path,PATH);
 
&nbsp;&nbsp;&nbsp;&nbsp;unsigned int len = strlen(addr.sun_path) + sizeof(addr.sun_family);
&nbsp;&nbsp;&nbsp;&nbsp;sockfd = socket(AF_UNIX,SOCK_DGRAM,0);
&nbsp;&nbsp;&nbsp;&nbsp;if(sockfd &lt; 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;socket error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;if(bind(sockfd,(struct sockaddr *)&amp;addr,len) &lt; 0)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;bind error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(sockfd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Bind is ok&#92;n&quot;);
 
&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char recv_buf[20] = &quot;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&amp;addr,&amp;len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Recv: %s&#92;n&quot;,recv_buf);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&#125;

</textarea><br/><br/>send.c<br/><textarea name="code" class="php" rows="15" cols="100">
/* ************************************************************************
 *&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Filename:&nbsp;&nbsp;send.c
 *&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;Description:&nbsp;&nbsp;
 *&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version:&nbsp;&nbsp;1.0
 *&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Created:&nbsp;&nbsp;2011年12月03日 20时42分37秒
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Revision:&nbsp;&nbsp;none
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compiler:&nbsp;&nbsp;gcc
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Author:&nbsp;&nbsp;YOUR NAME (), 
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Company:&nbsp;&nbsp;
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* ************************************************************************/
 
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;sys/un.h&gt;
 
#define PATH &quot;/data/codesdev/testdemo/sock/server.sock&quot;
 
int main(int argc,char *argv[])
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;int sockfd = 0;
&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_un addr;
&nbsp;&nbsp;&nbsp;&nbsp;bzero(&amp;addr,sizeof(addr));
 
&nbsp;&nbsp;&nbsp;&nbsp;addr.sun_family = AF_UNIX;
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(addr.sun_path,PATH);
 
&nbsp;&nbsp;&nbsp;&nbsp;sockfd = socket(AF_UNIX,SOCK_DGRAM,0);
&nbsp;&nbsp;&nbsp;&nbsp;if(sockfd &lt; 0)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;socket error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
 
&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static int counter = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char send_buf[20] = &quot;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(send_buf,&quot;Counter is %d&quot;,counter);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len = strlen(addr.sun_path)+sizeof(addr.sun_family);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendto(sockfd,send_buf,strlen(send_buf),0,(struct sockaddr*)&amp;addr,len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Send: %s&#92;n&quot;,send_buf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&#125;
</textarea><br/><br/>gcc server.c -o server<br/>gcc send.c -o send<br/><br/>[root@iZ25dcp92ckZ sock]# ./server<br/>Bind is ok<br/>有client启动后server响应如下：<br/>Recv: Counter is 1<br/>Recv: Counter is 2<br/>Recv: Counter is 3<br/>Recv: Counter is 4<br/><br/>[root@iZ25dcp92ckZ sock]# ./send <br/>Send: Counter is 1<br/>Send: Counter is 2<br/>Send: Counter is 3<br/>Send: Counter is 4<br/><br/>最后，还发现那个设备文件server.sock 不能直接cat去读取，只能stat：<br/>[root@iZ25dcp92ckZ sock]# cat server.sock <br/>cat: server.sock: 没有那个设备或地址<br/>[root@iZ25dcp92ckZ sock]# stat server.sock&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;文件：&quot;server.sock&quot;<br/>&nbsp;&nbsp;大小：0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 块：0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO 块：4096&nbsp;&nbsp; 套接字<br/>设备：ca01h/51713d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inode：16282&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 硬链接：1<br/>权限：(0755/srwxr-xr-x)&nbsp;&nbsp;Uid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)&nbsp;&nbsp; Gid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)<br/>最近访问：2016-04-18 14:11:20.878641353 +0800<br/>最近更改：2016-04-18 14:11:20.878641353 +0800<br/>最近改动：2016-04-18 14:11:20.878641353 +0800<br/>创建时间：-<br/>实践摘录自：http://www.cnblogs.com/hnrainll/archive/2011/12/03/2274973.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Unix域套接字，UNIX域套接字实例。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>