Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1047937
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: C/C++

2009-11-26 14:51:14

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) |
给主人留下些什么吧!~~