用socket实现本地通信 z


                     用socket实现本地进程间的通信
    用socket实现本地进程间的通信用到unix域协议.unix域协议不是用ip和端口来标示地址,而是用普通的系统文件来表示的.除了这个不同以外,它的实现跟socket基本一样.
    unix域的套接字地址结构如下:
    struct sockaddr_un
    {
      sa_family_t sun_family;
      char        sun_path[104];//存放在这结构中的地址必须以空字符结尾.
    }
    例子:
    服务器端:
#include <sys/socket.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/un.h>
#define filename "/home/temp.unix"
int main()
{
  int s;
  int client_s;
  struct sockaddr_un  addr;
  struct sockaddr_un  client_addr;
  int len=sizeof(client_addr);
  char buff[100];
  char client_buff[100]="data from  service/n";
  int n;
                                                                                                                                              
  s=socket(AF_UNIX,SOCK_STREAM,0);
  if(s<0)
       {
               printf("create socket fail/n");
               exit(0);
       }
  unlink(filename);      //先删除文件filename,以防止它已经存在
  bzero(&addr,sizeof(addr));//这个可以保证sun_path末尾是空字符,当然前提
                            // 是保证filename字符数小于104
  addr.sun_family=AF_UNIX;
  strcpy(addr.sun_path,filename);
  if(-1==bind(s,(struct sockaddr *)&addr,sizeof(addr)))
       {
               printf("bind socket fail/n");
               exit(0);
       }
  chmod(filename,0777);
  if(-1==listen(s,5))
       {
               printf("create listen socket fail!/n");
               exit(0);
       }
  client_s=accept(s,(struct sockaddr *)&client_addr,&len);
                                                                                                                                              
  n=read(client_s,buff,sizeof(buff)-1);
  buff[n]='/0';
  printf("data=%s/n",buff);
  write(client_s,client_buff,sizeof(client_buff));
  close(client_s);
  close(s);
  unlink(filename);  //最后把它删除
  return 1;
                                                                                                                                              
}
 
客户端:
 #include <sys/socket.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/un.h>
 #include <errno.h>
#define filename "/home/temp.unix"
 int main()
 {
   int s;
   int client_s;
   struct sockaddr_un  addr;
   char buff[100];
   char ser_buff[100]="data from client/n";
   int n;
   s=socket(AF_UNIX,SOCK_STREAM,0);
   if(s<0)
       {
             printf("create socket fail/n");
             exit(0);
        }
 bzero(&addr,sizeof(addr));
 addr.sun_family=AF_UNIX;
 strcpy(addr.sun_path,filename);
 if(-1==connect(s,(struct sockaddr *)&addr,sizeof(addr)))
                                  {
                     printf("connect socket fail and the errno=%d/n",errno);
                     exit(0);
                                  }
 write(s,ser_buff,sizeof(ser_buff));
 n=read(s,buff,sizeof(buff)-1);
 buff[n]='/0';
 printf("from service data=%s/n");
 close(s);
 return 1;
 }

 注意点:
 1:文件名应该用绝对路径,而不应该是相对路径.因为服务器和客户端都要用到这文件.如果用相对路径的话,
   那就要保证服务器和客户端要放在同个目录下,否则后果不可预料.
 2:用bind创建的文件属性默认是0777.但是它创建完后就会按照当前的umask值进行修改.
 3:客户端调用connect时要保证unix套接字已经存在,否则会发生错误,errno=2(没有这文件和目录).
 4:如果用的是数据报的协议,那么客户端要显示绑定一个路径名,这样服务器才会知道回复的地址.这主要
   是因为unix域不会默认产生一个路径名与socket绑定.

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值