移动端网站交互效果最好的,松岗做网站公司,wordpress lt,wordpress 图片 优化使用套接字除了可以实现网络间不同主机间的通信外#xff0c;还可以实现同一主机的不同进程间的通信#xff0c;且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口#xff0c;只是地址结构与某些参数不同。 用途
进程间通信#xff1a;本地套… 使用套接字除了可以实现网络间不同主机间的通信外还可以实现同一主机的不同进程间的通信且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口只是地址结构与某些参数不同。 用途
进程间通信本地套接字允许在同一台主机上的不同进程之间进行数据传输类似于管道pipe和命名管道FIFO但提供了更灵活和通用的解决方案。资源共享通过本地套接字进程可以共享数据、文件或设备等资源实现进程间的协同工作。服务间交互在分布式系统或微服务架构中本地套接字可以用于服务间的本地通信提高服务间的交互效率和可靠性。
应用场景
数据库服务数据库服务器和客户端进程通常运行在同一台主机上通过本地套接字进行通信实现数据的查询、插入、更新和删除等操作。中间件服务在分布式系统中中间件服务如消息队列、缓存服务等通常与应用程序运行在同一台主机上通过本地套接字进行通信实现数据的传递和处理。调试和测试在软件开发过程中开发人员可以使用本地套接字在本地环境中模拟网络通信进行调试和测试工作提高开发效率和质量。本地进程监控和管理系统管理工具可以使用本地套接字监控和管理本地进程如获取进程状态、终止进程等。
优点
高效性由于本地套接字不涉及网络通信因此数据传输速度更快延迟更低。可靠性本地套接字提供了稳定的进程间通信机制避免了网络通信中的不确定性和延迟。安全性由于数据在本地主机上传输因此安全性更高不易受到网络攻击和窃听。 本地套接字与普通套接字开发上的主要差异 协议族本地套接字使用AF_UNIX而普通套接字使用AF_INETIPv4或AF_INET6IPv6。 地址结构体本地套接字使用struct sockaddr_un而普通套接字使用struct sockaddr_inIPv4或struct sockaddr_in6IPv6。 套接字文件本地套接字在文件系统中创建一个套接字文件如/tmp/unix_socket而普通套接字则使用IP地址和端口号进行通信。 通信范围本地套接字仅限于同一台计算机上的进程间通信而普通套接字可以在网络上的不同计算机之间进行通信。 性能本地套接字由于不经过网络协议栈通常具有更低的延迟和更高的吞吐量。 安全性本地套接字由于通信双方在同一台计算机上相对更安全但也需要注意文件系统的权限设置。普通套接字则可能面临网络攻击的风险需要采取适当的安全措施。 完整例子如下不解释了。
service:
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/types.h
#include sys/socket.h
#include sys/un.h#define SOCKET_PATH /tmp/unix_socket
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_un address;int addrlen sizeof(address);char buffer[BUFFER_SIZE] {0};int opt 1;int addrlen_size;// 创建套接字if ((server_fd socket(AF_UNIX, SOCK_STREAM, 0)) 0) {perror(socket failed);exit(EXIT_FAILURE);}// 设置套接字选项允许重用地址和端口if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, opt, sizeof(opt))) {perror(setsockopt);close(server_fd);exit(EXIT_FAILURE);}// 清除地址结构memset(address, 0, sizeof(struct sockaddr_un));// 设置地址和端口address.sun_family AF_UNIX;strncpy(address.sun_path, SOCKET_PATH, sizeof(address.sun_path) - 1);// 绑定套接字到地址if (bind(server_fd, (struct sockaddr *)address, sizeof(struct sockaddr_un)) 0) {perror(bind failed);close(server_fd);exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) 0) {perror(listen);close(server_fd);unlink(SOCKET_PATH); // 删除套接字文件exit(EXIT_FAILURE);}// 接受客户端连接if ((new_socket accept(server_fd, (struct sockaddr *)address, (socklen_t*)addrlen_size)) 0) {perror(accept);close(server_fd);unlink(SOCKET_PATH); // 删除套接字文件exit(EXIT_FAILURE);}// 读取客户端发送的数据int valread read(new_socket, buffer, BUFFER_SIZE);printf(Received: %s\n, buffer);// 发送响应给客户端char *hello Hello from server;send(new_socket, hello, strlen(hello), 0);printf(Hello message sent\n);// 关闭套接字close(new_socket);close(server_fd);unlink(SOCKET_PATH); // 删除套接字文件return 0;
}
client
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/types.h
#include sys/socket.h
#include sys/un.h#define SOCKET_PATH /tmp/unix_socket
#define BUFFER_SIZE 1024int main() {int sock 0;struct sockaddr_un serv_addr;char buffer[BUFFER_SIZE] {0};char *hello Hello from client;// 创建套接字if ((sock socket(AF_UNIX, SOCK_STREAM, 0)) 0) {perror(Socket creation error);return -1;}serv_addr.sun_family AF_UNIX;strcpy(serv_addr.sun_path, SOCKET_PATH);// 连接服务端if (connect(sock, (struct sockaddr *)serv_addr, sizeof(struct sockaddr_un)) 0) {perror(Connection Failed);return -1;}// 发送数据到服务端send(sock, hello, strlen(hello), 0);printf(Hello message sent\n);// 读取服务端的响应int valread read(sock, buffer, BUFFER_SIZE);printf(Received: %s\n, buffer);// 关闭套接字close(sock);return 0;
} 其余自己脑补去。