AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
char buf[100];
void main(void)
{int sersock,cltsock;
 int len,clen;
 int ret=0;
 struct sockaddr_un seraddr,cltaddr;
 sersock=socket(AF_UNIX,SOCK_STREAM,0);
 if(sersock<0)  {return ;}
 memset(&seraddr,0,sizeof(seraddr));
 seraddr.sun_family=AF_UNIX;
 sprintf(seraddr.sun_path,"ser");
 unlink(seraddr.sun_path);
 len = offsetof(struct sockaddr_un, sun_path) + strlen(seraddr.sun_path);
 if (0 > bind(sersock, (struct sockaddr *)&seraddr, sizeof(struct sockaddr)) ||      //
        0 > listen(sersock, 10))
        {printf("fail to bind and lisen \n");}
     printf("Start to listen connect request from unix socket name: \"%s\"\n", seraddr.sun_path);
while(1)
{ clen=sizeof(cltaddr);
  cltsock=accept(sersock,(struct sockaddr*)&cltaddr,&clen);
  if(0>cltsock)
   {printf("ACCEPT  error\n");}
  clen -= offsetof(struct sockaddr_un, sun_path);
  cltaddr.sun_path[clen] = 0;
        while(1)
        {
         ret = recv(cltsock,buf,100, 0);
         buf[ret]=0;
         printf(buf);
         if (ret != send(cltsock, buf,ret, 0))
            {printf("AgentSrv send message fail\n");}
        } 
}
close(cltsock);
close(sersock);
}

 

 

客户端:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
char buf[100];
void main(void)
{
    int cltsock, len, err;
    struct sockaddr_un cltaddr;
    struct sockaddr_un seraddr;
  int ret;
    cltsock = socket(AF_UNIX, SOCK_STREAM, 0);
    if (cltsock < 0)
    {
     printf("socket creat error !!!\n");
      return;
    }
    memset(&cltaddr, 0, sizeof(cltaddr));
    cltaddr.sun_family = AF_UNIX;
    sprintf(cltaddr.sun_path, "clt");
    len = offsetof(struct sockaddr_un, sun_path) + strlen(cltaddr.sun_path);
    unlink(cltaddr.sun_path); //若已存在,先删除之
    if (bind(cltsock, (struct sockaddr *)&cltaddr, sizeof(struct sockaddr)) < 0)  //绑定之后才能建立文件路劲
    {
        printf("Bind socket to addr fail\n");
        close(cltsock);
        return;
    }
   
 /*   if(chmod(cltaddr.sun_path, S_IRWXU) < 0)     //修改文件权限:可以不需要
    {
        printf("Set %s rwx for user only fail\n", cltaddr.sun_path);
        return;
    }
*/
    //设置服务端地址
    memset((char*)&seraddr, 0, sizeof(seraddr));
    seraddr.sun_family = AF_UNIX;
    strcpy(seraddr.sun_path, "ser");
    len = offsetof(struct sockaddr_un, sun_path) + strlen("ser");
    //以客户端socket连接服务端地址
    if (connect(cltsock, (struct sockaddr *)&seraddr, len) < 0)
    {
        printf("Connect agent sock \"%s\" fail\n", "ser");
        return;
    }
    while(1)
    {printf("input a line:");
     gets(buf);
     len=strlen(buf);
     printf("\nsend cnt:%d\n",len);
     if (len != send(cltsock, buf, len, 0))
   {
    printf("Send msg fail\n");
    return ;
   }
   ret = recv(cltsock,buf,100, 0);
         buf[ret]=0;
         printf("\nreceived: %s\n",buf);
    }
    close(cltsock);
}

本文出自 “tech记录” 博客,谢绝转载!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。