一、域套接字概念
BSD UNIX最初引入套接字时只支持本地通信, 1986年之后进行了扩展,开始支持网络协议。在很多应用中,前后台进程通过UNIX域套接字进行通信。UNIX域套接字具有使用简单、效率高等特点。UNIX域套接字分为两种类型:流式套接字类型和用户数据报类型。
二、本地地址
当套接字用于网络通信时,我们使用结构体struct sockaddr_in(包含协议、IP地址和端口)h和某个套接字关联起来。
同样的,当套接字用于本地通信时,可以用结构体struct sockaddr_un描述一个本地地址。
以下为struct sockaddr_un 结构体的具体内容:
struct sockaddr_un{ unsigned short sun_family; //协议类型 char sun_path[108]; //套接字文件路径 }
三、域套接字类型
1、UNIX流式套接字(对应TCP传输)
UNIX域流式套接字的用法和TCP套接字基本一致,区别在于使用的协议和地址不同。
(1)UNIX域流式套接字服务器端流程如下:
(1)创建UNIX域流式套接字
(2)绑定本地地址(套接字文件)
(3)设置监听模式
(4)接收客户端的连接请求
(5)发送/接收数据
(2)UNIX域流式套接字客户端流程如下:
(1)创建UNIX域流式套接字
(2)指定服务器端地址(套接字文件)
(3)建立连接
(4)发送/接收数据
2、UNIX流式套接字(对应UDP传输)
UNIX域用户数据报套接字的流程只需要对UNIX流式套接字流程进行简化即可,所以只需要执行以下几步:
(1)、UNIX数据报套接字服务器端流程如下:
(1)创建UNIX域流式套接字
(2)绑定套接字
(3)发送/接收数据
(4)关闭套接字
(2)UNIX域流式套接字客户端流程如下:
(1)创建UNIX域流式套接字
(2)接收/发送数据
(3)关闭套接字
四、代码实例(以UDP为例)
1、服务器创建
/*=============================================================== * Copyright (C) 2022 All rights reserved. * * 文件名称:server_unx.c * 创 建 者:QiuCC * 创建日期:2022年08月18日 * 描 述: * * 更新日志: * ================================================================*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <sys/un.h> #define N 100 int main(int argc, char *argv[]) { remove("./socket"); struct sockaddr_un server_addr = {0}; server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, "./socket"); int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0); if(socket < 0) { perror("创建套接字"); exit(-1); } int ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(ret < 0) { perror("绑定套接字"); exit(-1); } ret = listen(sockfd, 5); if(ret = 0) { perror("监听套接字"); exit(-1); } char buf[N] = {0}; while(1) { memset(buf, 0, sizeof(buf)); ret = recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL); if(ret <0) { perror("接收"); exit(-1); } puts(buf); } return 0; }
2、客户端创建
/*=============================================================== * Copyright (C) 2022 All rights reserved. * * 文件名称:cilent_unx.c * 创 建 者:QiuCC * 创建日期:2022年08月18日 * 描 述: * * 更新日志: * ================================================================*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> int main(int argc, const char *argv[]) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("sockfd"); return -1; } printf("sockfd = %d\n", sockfd); struct sockaddr_in serveraddr,clientaddr; memset(&serveraddr, 0 ,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(6666); serveraddr.sin_addr.s_addr = inet_addr("0"); //自动路由,寻找IP地址 int len = sizeof(serveraddr); int ret = connect(sockfd, (struct sockaddr *)&serveraddr, len); if(ret == -1) { perror("connect"); return -1; } printf("connect success!\n"); //接收和发送数据 char buf[1024] = {0}; while(1) { gets(buf); send(sockfd, buf, strlen(buf), 0); memset(buf, 0, sizeof(buf)); } close(sockfd); return 0; }
五、结果展示
从上述结果可以看出UDP域套接字服务器和UDP套接字服务器都是没有和客户端建立连接的一种传输方式,并且UDP域套接字服务器在运行时会生成一个套接字文件socket(代码内部命名的)
好的,以上就是本期内容啦!!!
欢迎大家参考指正!!!