在 Linux 下用 C++ 实现通信,常见方式取决于通信对象(本机 / 网络)和场景。下面按常见需求给你一个系统性的总结,并附上可直接用的示例。
| 场景 | 推荐方式 |
|---|---|
| 本机进程间通信 | 管道、消息队列、共享内存、Unix Domain Socket |
| 网络通信 | TCP / UDP Socket |
| 高性能 / 低延迟 | 共享内存 + 信号量 |
| 本机简单通信 | 匿名管道 |
| 网络通用 | TCP Socket(最常用) |
Server: socket → bind → listen → accept → read/write
Client: socket → connect → read/write
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
bind(server_fd, (sockaddr*)&addr, sizeof(addr));
listen(server_fd, 5);
std::cout << "Server listening on port 8080..." << std::endl;
int client_fd = accept(server_fd, nullptr, nullptr);
char buf[1024]{};
read(client_fd, buf, sizeof(buf));
std::cout << "Received: " << buf << std::endl;
write(client_fd, "Hello from server", 18);
close(client_fd);
close(server_fd);
}
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
connect(sock, (sockaddr*)&addr, sizeof(addr));
write(sock, "Hello Server", 13);
char buf[1024]{};
read(sock, buf, sizeof(buf));
std::cout << "Server reply: " << buf << std::endl;
close(sock);
}
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
sockaddr_unint pipefd[2];
pipe(pipefd);
if (fork() == 0) { // 子进程
close(pipefd[1]);
char buf[100];
read(pipefd[0], buf, sizeof(buf));
} else { // 父进程
close(pipefd[0]);
write(pipefd[1], "hello", 5);
}
✅ 适合:
适合:
常用 API:
shmget / shmatsemget / semop(代码较复杂,需要我可以单独展开)
✅ 推荐库
boost.asio(跨平台,生产级)libeventZeroMQ❌ 不建议:
socket 写大型项目你可以直接告诉我:
我可以给你: