Linux本地套接字(Unix域套接字)----SOCK_DGRAM方式

简介: 这里介绍一下Linux进程间通信的socket方式---Local socket。这篇主要是介绍下SOCK_DGRAM方式的通信,即数据包的方式(与UDP类似),面向无连接。

 目录

简述

创建服务端代码:

创建客户端代码

接收函数封装

发送封装

服务端测试main函数

客户端测试main函数

编译运行结果


简述

这里介绍一下Linux进程间通信的socket方式---Local socket。这篇主要是介绍下SOCK_DGRAM方式的通信,即数据包的方式(与UDP类似),面向无连接。

这个代码是我刚开始学的时候写的,代码比较简单,适合初学,学习最快的方式就是直接拿源码修改、编译运行、调试。

完整源代码:零散Demo代码: 平时写的一些示例代码基本框架,封装,自定义控件等 - Gitee.com

创建服务端代码:

int startServer()
{
    int iRet;
  TSockAddrUn serv_unadr;
  TSockAddrIn serv_inadr;
  TSockAddr   *pSockAddr = NULL;
  bzero(&serv_unadr,sizeof(serv_unadr));
  bzero(&serv_inadr,sizeof(serv_inadr));
  serv_unadr.sun_family = AF_UNIX;
  strcpy(serv_unadr.sun_path,UNIX_SOCKET_PATH);
  pSockAddr = (TSockAddr *)&serv_unadr;
  signal(SIGPIPE, SIG_IGN);
  /* 创建本地socket */
  sockFd = socket(AF_UNIX, SOCK_DGRAM, 0);//数据包方式
  if ( sockFd <= 0)
  {
      perror("socket error");
      return sockFd;
  }
  /* 绑定监听口 */
    int flag = 1;
    iRet = setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
    setSocketAttr(sockFd);
    unlink(UNIX_SOCKET_PATH);
  iRet = bind(sockFd, pSockAddr, sizeof(TSockAddr));
  if (iRet != 0)
  {
      perror("bind error");
    close(sockFd);
    return -1;
  }
    return sockFd;
}

image.gif

创建客户端代码

面向无连接的方式,和服务端的代码差别不大:

int InitUdpClient()
{
  TSockAddrUn unadr;
  TSockAddr   *pSockAddr = NULL;
  bzero(&unadr,sizeof(unadr));
  char tmpPath[] = "/tmp/unix_XXXX";
  char *tmpName = mktemp(tmpPath);
  unadr.sun_family = AF_LOCAL;
  strcpy(unadr.sun_path, tmpName);
  pSockAddr = (TSockAddr *)&unadr;
  /* 创建本地socket */
  sockFd = socket(AF_LOCAL, SOCK_DGRAM, 0);//数据包方式
  if ( sockFd <= 0)
  {
      perror("CUdpClient:: socket error");
      return sockFd;
  }
  unlink(tmpPath);
  /* 绑定监听口 */
    //setSocketAttr(sockFd);
  int iRet = bind(sockFd,pSockAddr, sizeof(TSockAddr));
  if (iRet != 0)
  {
      perror("bind error");
    close(sockFd);
    return -1;
  }
    return sockFd;
}

image.gif

接收函数封装

//返回0 超时  timeOut-超时时间
int UnixRead(char *recvBuf, int len, int timeOut)
{
  int nRead = readable_timeo(sockFd, timeOut);
  if ( nRead <= 0 )
  {
    printf("UnixRead, read time out!\n");
    return 0;
  }
  pSockAddr = (TSockAddr *)&unClientaddr;
  socklen  = sizeof(TSockAddrUn);
  bzero(recvBuf, len);
  nRead = recvfrom(sockFd, recvBuf, len, 0, pSockAddr, &socklen);
  if ( nRead <= 0 )
  {
    if ( (EAGAIN == errno) || (EINTR == errno))
    {
      return 0;   //接收连接超时
    }
    perror("UnixRead read error:");
  }
  return nRead;
}

image.gif

发送封装

int UnixSend(const void *data, int len)
{
  TSockAddrUn unadr;
  TSockAddr   *pSockAddr = NULL;
  bzero(&unadr,sizeof(unadr));
  unadr.sun_family = AF_LOCAL;
  strcpy(unadr.sun_path, UNIX_SOCKET_PATH);
  pSockAddr = (TSockAddr *)&unadr;
  socklen_t socklen  = sizeof(TSockAddrUn);
  return sendto(sockFd, data, len, 0, pSockAddr, socklen);
}

image.gif

服务端测试main函数

int main()
{
  startServer();
  int nRead = 0;
  char recvBuf[1024] = {0};   
  while(1)
  {   
    nRead = UnixRead(recvBuf, 1024, 5);
    if ( nRead <= 0 )
    {
      continue;
    }
    else
    {
      printf("recv %d data: %s\n",nRead, recvBuf);
      const char *sendMsg = "svr ack!";
      UnixSend(sendMsg, strlen(sendMsg));
    }
    sleep(1);
  }
  return 0;
}

image.gif

客户端测试main函数

int main(  )
 {
   int sockFd = InitUdpClient();
   int nRead = 0;
   const char *sendMsg = "hello";
   char recvBuf[1024] = {0};
   while(1)
   {
    nRead = UnixSend(sendMsg, strlen(sendMsg));
    printf("send %d data: %s\n", nRead, sendMsg);
    nRead = UnixRead(recvBuf, 1024, 5);
    printf("recv %d data: %s\n", nRead, recvBuf);
    sleep(2);
   }
   return 0;
 }

image.gif

编译运行结果

左边是服务端,右边是客户端。

image.gif编辑


目录
相关文章
|
1月前
|
网络协议 Unix 数据安全/隐私保护
UNIX域套接字接口相似性
UNIX域套接字接口相似性
17 4
|
1月前
|
监控 安全 Unix
UNIX域套接字(Unix Domain Socket)在安全性和隐私性
UNIX域套接字(Unix Domain Socket)在安全性和隐私性
46 2
|
1月前
|
存储 Shell Linux
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
26 0
|
3月前
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
26 2
|
3月前
|
Unix Shell Linux
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
36 4
|
1月前
|
网络协议 Unix API
UNIX域套接字
UNIX域套接字
20 4
|
1月前
|
Oracle Ubuntu Unix
Unix与Linux区别
Unix: Unix是一个操作系统家族的名称,最早由贝尔实验室(Bell Labs)的肖像电机公司(AT&T)开发。最早的Unix版本是在1969年创建的。 Linux: Linux是由芬兰计算机科学家Linus Torvalds在1991年创建的。它是作为一个免费、开放源代码的Unix克隆而开始的。
19 1
|
2月前
|
Unix Shell Linux
在Unix/Linux Shell中,管道(`|`)和重定向
在Unix/Linux Shell中,管道(`|`)和重定向
23 1
|
3月前
|
Ubuntu Unix Linux
Unix/Linux操作系统的最强入门科普(经典)
Unix/Linux操作系统的最强入门科普(经典)
71 0
|
3月前
|
网络协议 Unix Linux
在Unix/Linux shell中,与网络相关的命令
在Unix/Linux shell中,与网络相关的命令
24 2