Linux本地Socket基础概念
Linux本地Socket,也称为Unix域Socket或IPC Socket(Inter-Process Communication Socket),是一种在同一台主机上的进程间通信(IPC)机制。它允许不同进程之间通过文件系统中的一个特殊文件进行通信,这个文件通常位于/tmp
或/var/run
目录下。
优势
类型
Linux本地Socket主要有两种类型:
应用场景
本地Socket常用于以下场景:
问题与解决
在使用Linux本地Socket时,可能会遇到以下问题:
close()
函数关闭Socket文件描述符。示例代码
以下是一个简单的Linux本地Socket客户端和服务器示例代码:
服务器端:
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int server_fd, client_fd;
struct sockaddr_un addr;
socklen_t len;
// 创建Socket
server_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("socket");
return 1;
}
// 绑定Socket到文件
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/tmp/mysocket", sizeof(addr.sun_path) - 1);
unlink("/tmp/mysocket");
if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("bind");
close(server_fd);
return 1;
}
// 监听连接
if (listen(server_fd, 5) == -1) {
perror("listen");
close(server_fd);
return 1;
}
// 接受连接
client_fd = accept(server_fd, NULL, &len);
if (client_fd == -1) {
perror("accept");
close(server_fd);
return 1;
}
// 读取数据并打印
char buf[1024];
ssize_t n = read(client_fd, buf, sizeof(buf));
if (n > 0) {
printf("Received: %s
", buf);
}
// 关闭连接
close(client_fd);
close(server_fd);
unlink("/tmp/mysocket");
return 0;
}
客户端:
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int client_fd;
struct sockaddr_un addr;
// 创建Socket
client_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (client_fd == -1) {
perror("socket");
return 1;
}
// 连接到服务器
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/tmp/mysocket", sizeof(addr.sun_path) - 1);
if (connect(client_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("connect");
close(client_fd);
return 1;
}
// 发送数据
const char *msg = "Hello, Server!";
write(client_fd, msg, strlen(msg));
// 关闭连接
close(client_fd);
return 0;
}
领取专属 10元无门槛券
手把手带您无忧上云