Linux本地套接字(Unix域套接字)----SOCK_DGRAM方式
目录
简述
这里介绍一下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方式的更多相关文章
- Unix域套接字简介
在Linux系统中,有很多进程间通信方式,套接字(Socket)就是其中的一种.但传统的套接字的用法都是基于TCP/IP协议栈的,需要指定IP地址.如果不同主机上的两个进程进行通信,当然这样做没什么问 ...
- Unix域套接字(Unix Domain Socket)介绍【转】
本文转载自:http://blog.csdn.net/roland_sun/article/details/50266565 版权声明:本文为博主原创文章,未经博主允许不得转载. 在Linux系统中, ...
- UNIX域套接字(unix domain)
UNIX域套接字用于在同一台机器上运行的进程之间的通信. UNIX域套接字提供流和数据报两种接口. 说明:UNIX域套接字比因特网套接字效率更高.它仅赋值数据:不进行协议处理,如添加或删除网络报头.计 ...
- 高级进程间通信之UNIX域套接字
UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...
- 通过UNIX域套接字传递描述符的应用
传送文件描述符是高并发网络服务编程的一种常见实现方式.Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现.本文详细说明一下传送文件描述符的应用. 1. TCP服务器程 ...
- UNIX域套接字编程和socketpair 函数
一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...
- 《网络编程》Unix 域套接字
概述 Unix 域套接字是一种client和server在单主机上的 IPC 方法.Unix 域套接字不运行协议处理,不须要加入或删除网络报头,无需验证和,不产生顺序号,无需发送确认报文,比因特网域套 ...
- UNIX网络编程——UNIX域套接字编程和socketpair 函数
一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...
- 通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数
在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h> #i ...
- unix域套接字
对于本地通信,unix域套接字通信是internet通信速度的2倍
随机推荐
- 记一次WPF程序带参数启动
问题:总共有两个程序.第一个程序使用Process带参数启动第二个程序. 网上一堆人都说什么重写Main入口啊 什么的.然后还一堆人跟着复制发文章.我也是醉了,简直是坑人.为何要舍近求远,直接重写AP ...
- flask 源码专题(五):SqlAlchemy 中操作数据库时session和scoped_session的区别
1原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalc ...
- java 数据结构(十二):Collections工具类的使用
Collections工具类1.作用:操作Collection和Map的工具类 2.常用方法:reverse(List):反转 List 中元素的顺序shuffle(List):对 List 集合元素 ...
- 前端01 /HTML简单简绍
前端01 /HTML简单简绍 目录 前端01 /HTML简单简绍 1.web服务本质 2.浏览器的工作流程 3.HTML是什么 4.web服务本质 5.HTML文档结构 6.HTML注释 6.标签语法 ...
- 网络编程-HTTPS
明文: 对称加密: 非对称:(公钥:pk 私钥:sk) 对称+非对称: 先用非对称方式发送num1给server,server用私钥得出key(由num1算出来),自此,约定C.S以此key(num1 ...
- CSS背景处理
CSS背景处理 背景样式 背景颜色 如果想让一个区域具有纯色的背景,可以使用background-color进行设置,背景颜色可以是rgb,rgba,#16网页色. <!DOCTYPE html ...
- 如何手写一个简单的LinkedList
这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是LinkedList的写法,需要注意的内容有以下几点: 1.LinkedList是由链表构成的,链表的核心即使data,前驱,后继 ...
- Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1
Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...
- IDEA 2020版破解
这期教一下大家如何破解IDEA 最新版破解教程 有以前的idea建议卸载哈~安装最新版的版本 一:我们首先去idea官网下载最新版 下方是idae官网2020最新链接 https://www.jetb ...
- react实战 : react 与 canvas
有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个正六边形组件,而这个用 SVG 和 canvas 都可以.我选择 canvas. 所以就变成了在 react 中使用 canv ...