当前位置: 首页 > news >正文

lv7 嵌入式开发-网络编程开发 13 UNIX域套接字

1 UNIX 域流式套接字

本地地址

struct sockaddr_un {unsigned short sun_family;    /* 协议类型 */char sun_path[108];        /* 套接字文件路径 */
};

UNIX 域流式套接字的用法和 TCP 套接字基本一致,区别在于使用的协议和地址不同

UNIX 域流式套接字服务器端流程如下:

(1)创建 UNIX 域流式套接字。

(2)绑定本地地址(套接字文件)。

(3)设置监听模式。

(4)接收客户端的连接请求。

(5)发送/接收数据。

补充:在linux中输入man bind,下方有流套接字示例代码

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>#define MY_SOCK_PATH "/tmp/my_sock_file"
#define LISTEN_BACKLOG 50#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)int main(int argc, char *argv[])
{int sfd, cfd;struct sockaddr_un my_addr, peer_addr;socklen_t peer_addr_size;char buf[BUFSIZ] = {};sfd = socket(AF_UNIX, SOCK_STREAM, 0);if (sfd == -1)handle_error("socket");memset(&my_addr, 0, sizeof(struct sockaddr_un));my_addr.sun_family = AF_UNIX;strncpy(my_addr.sun_path, MY_SOCK_PATH,sizeof(my_addr.sun_path) - 1);if (bind(sfd, (struct sockaddr *) &my_addr,sizeof(struct sockaddr_un)) == -1)handle_error("bind");if (listen(sfd, LISTEN_BACKLOG) == -1)handle_error("listen");peer_addr_size = sizeof(struct sockaddr_un);cfd = accept(sfd, (struct sockaddr *) &peer_addr,&peer_addr_size);if (cfd == -1)handle_error("accept");recv(cfd, buf, BUFSIZ, 0);printf("%s\n", buf);close(cfd);close(sfd);remove(MY_SOCK_PATH);return 0;
}

UNIX 域流式套接字客户端流程如下。

(1)创建 UNIX 域流式套接字。

(2)指定服务器端地址(套接字文件)。

(3)建立连接。

(4)发送/接收数据。

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>#define MY_SOCK_PATH "/tmp/my_sock_file"#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)int main(int argc, char *argv[])
{int fd;struct sockaddr_un peer_addr;char buf[BUFSIZ] = {"Hello World!"};fd = socket(AF_UNIX, SOCK_STREAM, 0);if (fd == -1)handle_error("socket");memset(&peer_addr, 0, sizeof(struct sockaddr_un));peer_addr.sun_family = AF_UNIX;strncpy(peer_addr.sun_path, MY_SOCK_PATH,sizeof(peer_addr.sun_path) - 1);if (connect(fd, (struct sockaddr *) &peer_addr,sizeof(struct sockaddr_un)) == -1)handle_error("connect");printf("%s\n",buf);send(fd, buf, strlen(buf), 0);close(fd);return 0;
}

2 UNIX 域数据报套接字

UNIX 域用户数据报套接字的流程可参考 UDP 套接字

UNIX 域流式套接字服务器端流程如下:

(1)创建 UNIX 域流式套接字。

(2)绑定本地地址(套接字文件)。

(3)发送/接收数据。

服务端

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>#define MY_SOCK_PATH "/tmp/my_sock_file"
#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)int main(int argc, char *argv[])
{int fd;struct sockaddr_un my_addr, peer_addr;socklen_t peer_addr_size;char buf[BUFSIZ] = {};fd = socket(AF_UNIX, SOCK_DGRAM, 0);if (fd == -1)handle_error("socket");memset(&my_addr, 0, sizeof(struct sockaddr_un));my_addr.sun_family = AF_UNIX;strncpy(my_addr.sun_path, MY_SOCK_PATH,sizeof(my_addr.sun_path) - 1);if (bind(fd, (struct sockaddr *) &my_addr,sizeof(struct sockaddr_un)) == -1)handle_error("bind");peer_addr_size = sizeof(struct sockaddr_un);recvfrom(fd, buf, BUFSIZ, 0, (struct sockaddr *) &peer_addr,&peer_addr_size);printf("%s\n",buf);close(fd);remove(MY_SOCK_PATH);return 0;
}

客户端 

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>#define MY_SOCK_PATH "/tmp/my_sock_file"
#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)int main(int argc, char *argv[])
{int fd;struct sockaddr_un peer_addr;socklen_t peer_addr_size;char buf[BUFSIZ] = {"Hello World!"};fd = socket(AF_UNIX, SOCK_DGRAM, 0);if (fd == -1)handle_error("socket");memset(&peer_addr, 0, sizeof(struct sockaddr_un));peer_addr.sun_family = AF_UNIX;strncpy(peer_addr.sun_path, MY_SOCK_PATH,sizeof(peer_addr.sun_path) - 1);peer_addr_size = sizeof(struct sockaddr_un);printf("%s\n", buf);sendto(fd, buf, strlen(buf), 0, (struct sockaddr *) &peer_addr,peer_addr_size);close(fd);remove(MY_SOCK_PATH);return 0;
}

http://www.lryc.cn/news/183396.html

相关文章:

  • blender光照系统设置
  • 华为云云耀云服务器L实例评测|基于canal缓存自动更新流程 SpringBoot项目应用案例和源码
  • vue3 中使用echarts图表——柱状图
  • 基于Java的家政公司服务平台设计与实现(源码+lw+部署文档+讲解等)
  • 深入了解 PostgreSQL:功能、特性和部署
  • 平台项目列表页实现(二)
  • osg实现鼠标框选
  • 电路原理解题笔记(一)
  • 分享几个优秀开源免费管理后台模版,建议收藏!
  • BFS模板:844. 走迷宫
  • re学习(37)DASCTF 2023 0X401七月暑期挑战赛 controflow
  • 数字IC前端学习笔记:数字乘法器的优化设计(进位保留乘法器)
  • prority_queue的学习
  • 【vue3】toRef与toRefs的使用,toRef与ref的区别
  • 信息论基础第二章部分习题
  • 信息化发展73
  • 560. 和为 K 的子数组
  • 24 mysql all 查询
  • 【Excel单元格数值统计】python实现-附ChatGPT解析
  • 爬虫项目实战——爬取B站视频
  • 关掉在vscode使用copilot时的提示音
  • 【有限域除法】二元多项式除法电路原理及C语言实现
  • RabbitMQ核心总结
  • Unicode与UTF-8
  • A : DS单链表--类实现
  • React Hooks —— ref hooks
  • 泛型与Gson解析
  • c++使用ifstream和ofstream报错:不允许使用不完整的类型
  • 调试器通用波形显示工具
  • Linux中getopt函数、optind等变量使用详解