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倍
随机推荐
- include文件包含漏洞
发现allow_url_include 是on状态 既然已经直接包含了phpinfo()是文件,首先搜索了一下allow_url_include,发现是处于打开的状态. 既然 allow_url_in ...
- JVM 专题十三:运行时数据区(八)直接内存
1. 直接内存 不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 直接内存是Java堆外的.直接向系统申请的内存区间. 来源于NIO,通过存在堆中的Direc ...
- mysql数据的增删改-内含经典面试题
#DML语言 /* 数据操作语言: 插入:insert 修改:update 删除:delete */ #一.插入语句 #方式一:经典的插入 /* 语法: insert into 表名(列名,...) ...
- SonarQube+Jenkins+Cppcheck实现C++代码扫描
背景:公司部分项目是由C++进行开发,因此对此有需求. sonarqube:docker化安装(alpine系统),版本8.3.1 (build 34397) jenkins:docker化安装,版本 ...
- bzoj1682[Usaco2005 Mar]Out of Hay 干草危机*
bzoj1682[Usaco2005 Mar]Out of Hay 干草危机 题意: 给个图,每个节点都和1联通,奶牛要从1到每个节点(可以走回头路),希望经过的最长边最短. 题解: 求最小生成树即可 ...
- 初识:LevelDB
初识:LevelDB 上篇文章缘起:BigTable可以说是已经把论文Bigtable: A Distributed Storage System for Structured Data中的内容掰扯的 ...
- 如何手写一个简单的LinkedList
这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是LinkedList的写法,需要注意的内容有以下几点: 1.LinkedList是由链表构成的,链表的核心即使data,前驱,后继 ...
- 6.ALOHA协议
动态媒体接入控制/多点接入特点:信道并非在用户通信时固定分配给用户. 一.纯ALOHA协议 纯 ALOHA协议思想:不监听信道,不按时间槽发送,随机重发.想发就发 二.时隙ALOHA协议 时隙 ALO ...
- java基础知识--数据类型
计算机时识别不了我们编写的代码语言,计算机中的数据全部采用二进制表示,即0和1表示的数字,每一个0或者1就是一个位,一个位叫做一个bit(比特).(实际上计算机只能识别高低电平,而不是0和1.) 字节 ...
- 不是吧,阿sir,2020年程序员要不好过?
自从网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势.” 不是,我就不明白了,你们怎么就看不得程序员好呢?天天巴望着程序员降薪.转行.裁员… ...