Unix Socket

作者: Hly_Coder | 来源:发表于2016-07-19 17:46 被阅读3262次

    转载请标明出处:http://www.jianshu.com/users/183339cdc7ae/latest_articles

    概述

    socket通信是大家耳熟能详的一种进程间通信方式(IPC),它是一种全双工的通信方式,不同于pipe这种单工方式.这篇文章将深入浅出的讲解一下什么是socket。
    我们常说的socket通信有以下二种,主要会说一下Unix domain socket

    Internet domain socket

    该socket可以用于不同主机间的通信,就像聊QQ一样只要知道了对方的QQ号就可以聊天了。socket只要知道了对方的ip地址和端口就可以通信了所以这种socket通信是基于网络协议栈的。

    Unix domain socket

    该socket用于一台主机的进程间通信,不需要基于网络协议,主要是基于文件系统的。与Internet domain socket类似,需要知道是基于哪一个文件(相同的文件路径)来通信的
    unix domain socket有2种工作模式一种是SOCK_STREAM,类似于TCP,可靠的字节流。另一种是SOCK_DGRAM,类似于UDP,不可靠的字节流。

    工作模型

    socket通信有一个服务端,一个客服端
    服务端:创建socket—绑定文件(端口)—监听—接受客户端连接—接收/发送数据—…—关闭
    客户端:创建socket—绑定文件(端口)—连接—发送/接收数据—…—关闭

    代码框架

    server

    sockaddr_un :为一个系统级的结构体,主要用于存储地址

    #define NAME "socketAddr"
    main(){   
      ...   
      struct sockaddr_un server;   
       ...   
      int sock = socket(AF_UNIX, SOCK_STREAM, 0);   
      strcpy (server.sun_path, NAME);   
      ...
      bind(sock, (structsockaddr *) &server, sizeof(struct sockaddr_un));   
      ...
      listen(sock, 5);   
      ...    
      while(1){       
        ...       
      msgsock = accept(sock, 0, 0);      
      ...      
      rval = read(msgsock, buf, 1024))      
      ...    
      }
    }
    

    client

    #define NAME "socketAddr"
    main(){   
      ...    
      sock = socket(AF_UNIX, SOCK_STREAM, 0);    
      strcpy(server.sun_path, NAME);     
      ...    
      if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {        
          close(sock);        
          exit(1);    
      }    
      if (write(sock, DATA, sizeof(DATA)) < 0)        
          perror("writing on stream socket");    
          close(sock);
      }
    

    demo下载

    github下载
    使用:

    1. gcc service.c -o service
    2. gcc client.c -o client
    3. linux下启动一个窗口运行 ./service
    4. 启动另一个窗口运行 ./client socket 【这个socket为service中绑定的地址】
      运行后可以发现,在当前目录下会多一个名叫socket的文件,这2个进程就是基于该文件通信的

    相关文章

      网友评论

        本文标题:Unix Socket

        本文链接:https://www.haomeiwen.com/subject/xsomjttx.html