Unix Socket

转载请标明出处: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个进程就是基于该文件通信的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2017-5-10 需求: arm与stm32在android平台中通信,串口由stm操作,由arm发送指令给st...
    ProgZack阅读 12,731评论 0 3
  • Socket 介绍 概述 socket是一种IPC方法,它允许位于同一主机或使用网络连接起来的不同主机的应用程序之...
    666真666阅读 3,187评论 1 54
  • 原文地址:http://www.cnblogs.com/skynet/archive/2010/12/12/190...
    archyly阅读 1,073评论 0 8
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    y角阅读 2,587评论 2 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139