本地套接字(Unix Domain Sockets)是一种进程间通信(IPC)机制,允许同一台机器上的进程之间进行通信。与网络套接字不同,本地套接字不涉及网络协议栈,因此它们通常比网络套接字更快且更安全。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/my_socket"
int main() {
int sockfd;
struct sockaddr_un addr;
char buffer[1024];
// 创建套接字
if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 绑定地址
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
unlink(SOCKET_PATH);
if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
close(sockfd);
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(sockfd, 5) == -1) {
perror("listen");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Waiting for connection...\n");
int connfd = accept(sockfd, NULL, NULL);
if (connfd == -1) {
perror("accept");
close(sockfd);
exit(EXIT_FAILURE);
}
// 接收数据
ssize_t numbytes = recv(connfd, buffer, sizeof(buffer), 0);
if (numbytes == -1) {
perror("recv");
close(connfd);
close(sockfd);
exit(EXIT_FAILURE);
}
buffer[numbytes] = '\0';
printf("Received message: %s\n", buffer);
// 关闭连接
close(connfd);
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/my_udp_socket"
int main() {
int sockfd;
struct sockaddr_un addr;
char buffer[1024];
// 创建套接字
if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 绑定地址
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
unlink(SOCKET_PATH);
if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
close(sockfd);
exit(EXIT_FAILURE);
}
// 接收数据
ssize_t numbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);
if (numbytes == -1) {
perror("recvfrom");
close(sockfd);
exit(EXIT_FAILURE);
}
buffer[numbytes] = '\0';
printf("Received message: %s\n", buffer);
// 关闭套接字
close(sockfd);
return 0;
}
原因:尝试绑定到一个已经存在的套接字文件。
解决方法:
unlink(SOCKET_PATH);
在绑定之前删除已存在的套接字文件。
原因:当前用户没有权限创建或访问套接字文件。
解决方法: 确保运行程序的用户有足够的权限,或者更改套接字文件的权限。
原因:监听套接字的进程没有运行或者没有正确绑定地址。
解决方法: 确保监听进程正在运行并且正确绑定了地址。
通过以上信息,你应该能够理解Linux C本地套接字的基础概念、优势、类型、应用场景以及常见问题的解决方法。
领取专属 10元无门槛券
手把手带您无忧上云