目录

简述

创建服务端代码:

创建客户端代码

接收函数封装

发送封装

服务端测试main函数

客户端测试main函数

编译运行结果


简述

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

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

完整源代码:https://gitee.com/fensnote/demo_code/tree/master/Linux/unix_socket

创建服务端代码:

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;
}

创建客户端代码

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

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;
}

接收函数封装

//返回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;
}

发送封装

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);
}

服务端测试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;
}

客户端测试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;
}

编译运行结果

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

Linux本地套接字(Unix域套接字)----SOCK_DGRAM方式的更多相关文章

  1. Unix域套接字简介

    在Linux系统中,有很多进程间通信方式,套接字(Socket)就是其中的一种.但传统的套接字的用法都是基于TCP/IP协议栈的,需要指定IP地址.如果不同主机上的两个进程进行通信,当然这样做没什么问 ...

  2. Unix域套接字(Unix Domain Socket)介绍【转】

    本文转载自:http://blog.csdn.net/roland_sun/article/details/50266565 版权声明:本文为博主原创文章,未经博主允许不得转载. 在Linux系统中, ...

  3. UNIX域套接字(unix domain)

    UNIX域套接字用于在同一台机器上运行的进程之间的通信. UNIX域套接字提供流和数据报两种接口. 说明:UNIX域套接字比因特网套接字效率更高.它仅赋值数据:不进行协议处理,如添加或删除网络报头.计 ...

  4. 高级进程间通信之UNIX域套接字

    UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...

  5. 通过UNIX域套接字传递描述符的应用

      传送文件描述符是高并发网络服务编程的一种常见实现方式.Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现.本文详细说明一下传送文件描述符的应用. 1. TCP服务器程 ...

  6. UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  7. 《网络编程》Unix 域套接字

    概述 Unix 域套接字是一种client和server在单主机上的 IPC 方法.Unix 域套接字不运行协议处理,不须要加入或删除网络报头,无需验证和,不产生顺序号,无需发送确认报文,比因特网域套 ...

  8. UNIX网络编程——UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  9. 通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

    在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h>  #i ...

  10. unix域套接字

    对于本地通信,unix域套接字通信是internet通信速度的2倍

随机推荐

  1. CSRF攻击原理以及防御方法(写的很好)

    转载地址:http://www.phpddt.com/reprint/csrf.html        CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟 ...

  2. MCU 51-1概述

    Microcontroller Unit 单片机:将微处理器CPU.存储器(RAM.ROM) .基本输入/输出(I/O) 接口电路和总线接口等组装在一块主机板(即微机主板). 微型计算机:将微处理器C ...

  3. 机器学习实战基础(二十二):sklearn中的降维算法PCA和SVD(三) PCA与SVD 之 重要参数n_components

    重要参数n_components n_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数. ...

  4. 数据可视化之DAX篇(五) 使用PowerBI的这两个函数,灵活计算各种占比

    https://zhuanlan.zhihu.com/p/57861350 计算个体占总体的比例是一个很常见的分析方式,它很简单,就是两个数字相除,但是当需要计算的维度.总体的范围发生动态变化时,如何 ...

  5. mysql子查询习题98

    #1.查询工资最低的员工信息:last name, salary SELECT last_name, salary FROM employees WHERE salary = ( SELECT MIN ...

  6. redis入门指南(三)—— 事务、过期时间、SORT命令、消息通知与管道

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 事务 1.redis中的事务由一组命令的集合组成,要么都执行,要么都不执行,同时redis的事务 ...

  7. Sympy常用函数总结

    基础 from sympy import * 数学格式输出: init_printing() 添加变量: x, y, z, a, b, c = symbols('x y z a b c') 声明分数: ...

  8. CobaltStrike上线Linux主机(CrossC2)

    一.简述 CrossC2插件是为企业和红团队人员提供的安全框架,支持 CobaltStrike 对其他平台的渗透测试(Linux / MacOS /...),支持自定义模块,并包括一些常用的渗透模块. ...

  9. void operator()()的功能

    在学习多线程的时候看到这样的一段代码,为什么要重载()呢?真有这个必要吗? #include <iostream> #include <thread> class Counte ...

  10. zabbix自定义监控(当会话登录超过三个就报警)

    安装过程在此省略. 1.agent端去修改配置文件 2.调用自定义内容 vim /etc/zabbix/zabbix_agentd.d/login.conf UserParameter=login-u ...