Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。
Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。
在一个终端运行服务器,然后在另一个终端(在相同目录下)运行客户端。当从客户端输入一行时,数据将通过套接字送到服务器。当退出客户端,服务器将
等待另外一个连接。还可以通过客户端程序的重定向输入来传送文件,cat uclient.c | ./uclient 或 ./uclient
< uclient.c。
服务器程序userver.c
#include
#include
#include
#include
#include
int main(int argc,char ** argv)
{
struct sockaddr_un un;
int sockfd,connfd;
size_t size;
//Socket
if((sockfd = socket(AF_UNIX,SOCK_STREAM,0))<0)
perror("socket");
/* Remove any preexisting socket(or other file) */
unlink("./sample-socket");
un.sun_family = AF_UNIX;
strcpy(un.sun_path,"./sample-socket");
size = offsetof(struct sockaddr_un,sun_path) + strlen(un.sun_path);
//Bind
if((bind(sockfd,(struct sockaddr *)&un,size))<0)
perror("bind");
//Listen
if((listen(sockfd,5))<0)
perror("listen");
while((connfd = accept(sockfd,(struct sockaddr *)&un,&size))>=0)
{
printf("----getting data\n");
send(connfd,"hello world!",12,0);
printf("----done\n");
}
if(connfd<0)
perror("accept");
close(sockfd);
return 0;
}
客户端程序uclient.c
#include
#include
#include
#include
#include
int main(void)
{
struct sockaddr_un un;
int sockfd;
size_t size;
char buf[4096];
if((sockfd=socket(AF_UNIX,SOCK_STREAM,0))<0)
perror("socket");
un.sun_family = AF_UNIX;
strcpy(un.sun_path,"./sample-socket");
size = offsetof(struct sockaddr_un,sun_path) + strlen(un.sun_path);
if((connect(sockfd,(struct sockaddr*)&un,size))<0)
perror("connect");
recv(sockfd,buf,sizeof(buf),0);
printf("buf=%s,sizeof(buf)=%d\n",buf,sizeof(buf));
close(sockfd);
return 0;
}
阅读(660) | 评论(0) | 转发(0) |