Unix Socket

2,299 阅读2分钟

转载请标明出处:www.jianshu.com/users/18333…

概述

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个进程就是基于该文件通信的