目录

简述

创建服务端代码:

创建客户端代码

接收函数封装

发送封装

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

编译运行结果

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

最新文章

  1. 最短路径——Floyd-Warshall算法
  2. SE_homework1(第一部分)
  3. hdu 1712, multiple-choice knapsack, 分类: hdoj 2015-07-18 13:25 152人阅读 评论(0) 收藏
  4. ACM 暴力搜索题 题目整理
  5. Spring的第一个例子
  6. velocity模板引擎学习(2)-velocity tools 2.0
  7. JQuery Cross Domain
  8. Django 分页2 (Pagination)
  9. 删除Ngnix 日志
  10. UVA 10529-Dumb Bones(概率dp)
  11. 生产者消费者问题c语言实现
  12. Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式
  13. QQGame防专线中断系统介绍
  14. jar包冲突与inode
  15. PHP码农在Golang压力下的生存之道-PHP性能优化实践
  16. 有关uploadifive的使用经验(转:http://www.cnblogs.com/itBscs/p/4781786.html )
  17. 编程心法 之 敏捷开发(新架构)Agile Team Organization Squads, Chapters, Tribes and Guilds
  18. SPP-Net理解
  19. TCP建立与断开连接、socket通讯模板
  20. Python-Django下载与基本命令

热门文章

  1. 如何在Linux环境下用虚拟机跑Windows!
  2. python面试题:redis数据库
  3. PHP 反序列化漏洞入门学习笔记
  4. Markdown 教程之编辑器
  5. 干货分享:Python Web 部署方式大全
  6. springcloud ribbon的 @LoadBalanced注解
  7. .Net Core 项目开发中的Errors,Exceptions
  8. springboot(五)使用FastJson返回Json视图
  9. xctf-web fakebook
  10. three.js 欧拉角和四元数