Linux 域套接字编程实例分析
提供一个 Linux 域套接字编程的实用示例,并结合代码阐述其工作原理和关键步骤。
// 服务端代码示例
// ... 头文件和错误处理 ...
int main() {
int socket_fd, client_fd;
struct sockaddr_un server_addr, client_addr;
socklen_t client_addr_len;
char buffer[1024];
// 创建域套接字
socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
// ... 错误处理 ...
// 绑定地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path, "socket_path");
unlink("socket_path");
bind(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
// ... 错误处理 ...
// 监听连接
listen(socket_fd, 5);
// ... 错误处理 ...
// 接受连接
client_addr_len = sizeof(client_addr);
client_fd = accept(socket_fd, (struct sockaddr *)&client_addr, &client_addr_len);
// ... 错误处理 ...
// 读取数据
read(client_fd, buffer, sizeof(buffer));
// ... 处理数据 ...
// 发送数据
write(client_fd, buffer, strlen(buffer) + 1);
// 关闭连接
close(client_fd);
close(socket_fd);
return 0;
}
代码解析:
- 创建套接字: 使用
socket(AF_UNIX, SOCK_STREAM, 0)
创建一个流类型的域套接字。 - 绑定地址: 使用
bind()
函数将套接字绑定到指定的路径。 - 监听连接: 使用
listen()
函数监听来自客户端的连接请求。 - 接受连接: 使用
accept()
函数接受客户端连接请求,并返回一个新的套接字用于与客户端通信。 - 数据传输: 使用
read()
和write()
函数进行数据的接收和发送。 - 关闭连接: 使用
close()
函数关闭套接字。
客户端代码示例:
// ... 头文件和错误处理 ...
int main() {
int socket_fd;
struct sockaddr_un server_addr;
char buffer[1024];
// 创建域套接字
socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
// ... 错误处理 ...
// 连接服务器
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path, "socket_path");
connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
// ... 错误处理 ...
// 发送数据
write(socket_fd, "Hello from client", strlen("Hello from client") + 1);
// 读取数据
read(socket_fd, buffer, sizeof(buffer));
// ... 处理数据 ...
// 关闭连接
close(socket_fd);
return 0;
}
代码解析:
- 创建套接字: 与服务端类似,使用
socket()
函数创建域套接字。 - 连接服务器: 使用
connect()
函数连接到服务器地址。 - 数据传输: 使用
write()
和read()
函数进行数据的发送和接收。 - 关闭连接: 使用
close()
函数关闭套接字。
总结
通过实例代码详细介绍了 Linux 域套接字编程的基本流程和关键步骤,并对代码进行了详细的解析,帮助读者更好地理解和应用域套接字进行进程间通信。
25.95KB
文件大小:
评论区