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倍
随机推荐
- Anbox补充:添加arm支持(失败!)
写在开头: 本人是一边操作一边写博文的,折腾一下午写到最后失败了不舍得删,还是发上来记录一下我的操作,希望能有高人指点或者给同学们一点启发.以下的内容仅做观看即可,若无必要就不必尝试了. 之前写了一篇 ...
- 04 Django模型层: Django-model进阶
一 QuerySet对象 1.1可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # ...
- PHP create_function()代码注入
查看代码 分析 变量$action要出现数字字母以外的字符,还要执行函数. /i不区分大小写 /s匹配任何不可见字符,包括空格.制表符.换页符等等 /D如果使用$限制结尾字符,则不允许结尾有换行 这里 ...
- 递归实现DropDownList层级
.NET下拉框DropDownList层级实现 这也算是第一篇博客吧,技术比较菜,写得不好,希望各位博友见谅哈,多多提提意见. 今天做电商网站新闻添加的时候,下拉框选择新闻类别觉得太长,又无法定位其准 ...
- Scala 面向对象(十二):嵌套类
在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构.如在类中可以再定义一个类,这样的类是嵌套类,其他语法结构也是一样. 嵌套类类似于Java中的内部类. Scala嵌套类的使用1 请编写程序, ...
- 数据可视化之PowerQuery篇(十九)PowerBI数据分析实践第三弹 | 趋势分析法
https://zhuanlan.zhihu.com/p/133484654 本文为星球嘉宾"海艳"的PowerBI数据分析工作实践系列分享之三,她深入浅出的介绍了PowerBI ...
- 那些非cmake生成的VTK工程存在的让人崩溃的坑
由于cmake和IDE的一些编译选项不同,所以导致我们使用者需要多做一些事情.而且vtk官方也表示: If you are not using CMake to compile your code, ...
- python利用selenium(webdriver chrome)模拟登陆获取cookie
(我是在windows下进行实验的) 准备工作: 1.安装python环境. 2.python安装selenium插件(执行以下命令就行). pip install selenium 3.Wind ...
- 图解java方法的简单执行步骤
图解java方法的简单执行步骤 1,找到该方法 2 传入对应的参数 3 执行方法体 4 返回结果
- http连接池存在的问题
连接的有效性检测是所有连接池都面临的一个通用问题,大部分HTTP服务器为了控制资源开销,并不会 永久的维护一个长连接,而是一段时间就会关闭该连接.放回连接池的连接,如果在服务器端已经关闭,客 户端是无 ...