Linux进程间通信方式之插座使用实例

  

套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。
  套接字的特性有三个属性确定,它们是:域(域),类型(类型),和协议(协议),套接字还用地址作为它的名字。地址的格式随域(又被称为协议族,协议的家庭)的不同而不同,每个协议族又可以使用一个或多个地址族定义地址格式。
  

  


  

  

域指定套接字通信中使用的网络介质。最常见的套接字域是AF_INET,它是指互联网网络,许多Linux局域网使用的都是该网络,当然,因特网自身用的也是它。其底层的协议——网际协议(IP)只有一个地址族,它使用一种特定的方式来指定网络中的计算机,即IP地址。
  

  

在计算机系统内部,端口通过分配一个唯一的16位的整数来表示,在系统外部,则需要通过IP地址和端口号的组合来确定。
  

  


  

  

流套接字(在某些方面类似域标准的输入/输出流)提供的是一个有序,可靠,双向字节流的连接。
  

  

流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP连接实现的。他们也是AF_UNIX域中常见的套接字类型。
  

  

<强>数据包套接字
  

  

与流套接字相反,由类型SOCK_DGRAM指定的数据包套接字不建立和维持一个连接。它对可以发送的数据包的长度有限制。数据报作为一个单独的网络消息被传输,它可能会丢失,复制或乱序到达。
  

  

数据报套接字实在AF_INET域中通过UDP/IP连接实现,它提供的是一种无需的不可靠服务。
  

  


  

  

只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。

  

先上一个代码
  

  

服务端:

     //s_unix.c   # include & lt; stdio.h>   # include & lt; sys/types.h>   # include & lt; sys/socket.h>   # include & lt; sys/un.h>   #定义UNIX_DOMAIN“/tmp/UNIX.domain”   int主要(空白)   {   socklen_t clt_addr_len;   int listen_fd;   int com_fd;   int受潮湿腐烂;   int我;   静态字符recv_buf [1024];   int len;   struct sockaddr_un clt_addr;   struct sockaddr_un srv_addr;   listen_fd=插座(PF_UNIX SOCK_STREAM 0);   如果(listen_fd<0)   {   perror(“不能创建通信套接字”);   返回1;   }//设置服务器addr_param   srv_addr.sun_family=AF_UNIX;   strncpy (srv_addr.sun_path UNIX_DOMAIN, sizeof (srv_addr.sun_path) 1);   分离(UNIX_DOMAIN);//绑定sockfd,addr   ret=绑定(listen_fd (struct sockaddr *), srv_addr, sizeof (srv_addr));   如果(ret==1)   {   perror(“不能绑定服务器套接字”);   关闭(listen_fd);   分离(UNIX_DOMAIN);   返回1;   }//听sockfd   ret=听(listen_fd, 1);   如果(ret==1)   {   perror(“不能听客户端连接请求”);   关闭(listen_fd);   分离(UNIX_DOMAIN);   返回1;   }//连接请求使用接受   len=sizeof (clt_addr);   com_fd=接受(listen_fd (struct sockaddr *), clt_addr,, len);   如果(com_fd<0)   {   perror(“不能接受客户端连接请求”);   关闭(listen_fd);   分离(UNIX_DOMAIN);   返回1;   }//读取和printf发送客户端信息   printf ("/n==========信息/n”);   (i=0; i<4,我+ +)   {   memset (recv_buf 0 1024);   int num=阅读(com_fd recv_buf, sizeof (recv_buf));   printf("消息从客户端(% d)): % s/n”, num, recv_buf);   }   关闭(com_fd);   关闭(listen_fd);   分离(UNIX_DOMAIN);   返回0;   }      

客户端:

     //c_unix.c   # include & lt; stdio.h>   # include & lt; sys/types.h>   # include & lt; sys/socket.h>   # include & lt; sys/un.h>   #定义UNIX_DOMAIN“/tmp/UNIX.domain”   int主要(空白)   {   int connect_fd;   int受潮湿腐烂;   char snd_buf [1024];   int我;   静态结构sockaddr_un srv_addr;//创建unix socket   connect_fd=插座(PF_UNIX SOCK_STREAM 0);   如果(connect_fd<0)   {   perror(“不能创建通信套接字”);   返回1;   }   srv_addr.sun_family=AF_UNIX;   strcpy (srv_addr.sun_path UNIX_DOMAIN);//连接服务器   ret=连接(connect_fd (struct sockaddr *), srv_addr, sizeof (srv_addr));   如果(ret==1)   {   perror(“不能连接到服务器”);   关闭(connect_fd);   返回1;   }   memset (snd_buf 0 1024);   strcpy (snd_buf”,消息从客户端”);//向服务器发送信息   (i=0; i

Linux进程间通信方式之插座使用实例