下面是一个通过Socket实现本机不同进程间通信的简单示例:
- 创建服务端代码(server.cpp):
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// 创建 socket 文件描述符
if ((server_fd = socket(AF_INET, 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");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET; // IPv4
address.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口
address.sin_port = htons(8080); // 使用8080端口
// 绑定 IP 地址和端口号到套接字
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address))<0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 开始监听连接请求
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port 8080" << std::endl;
// 等待客户端连接并处理请求
while ((new_socket = accept(server_fd,
(struct sockaddr *)&address,
(socklen_t*)&addrlen)) > 0) {
// 在此处处理客户端请求,可以发送和接收数据
// 例如,可以通过read()函数从套接字接收数据,通过write()函数向套接字发送数据
close(new_socket); // 关闭连接
}
return 0;
}
- 创建客户端代码(client.cpp):
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int client_fd;
struct sockaddr_in server_address;
if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
server_address.sin_family = AF_INET; // IPv4
server_address.sin_port = htons(8080); // 连接到8080端口
// 将IP地址从字符串转换为网络字节序
if(inet_pton(AF_INET, "127.0.0.1", &(server_address.sin_addr)) <= 0) {
perror("Invalid address/ Address not supported");
exit(EXIT_FAILURE);
}
// 连接到服务器
if (connect(client_fd, (struct sockaddr *)&server_address,
sizeof(server_address)) < 0) {
perror("Connection Failed");
exit(EXIT_FAILURE);
}
std::cout << "Connected to the server" << std::endl;
// 在此处进行与服务端的通信,可以发送和接收数据
// 例如,可以使用write()函数向服务器发送数据,并使用read()函数从服务器接收数据
close(client_fd); // 关闭连接
return 0;
}
分别编译服务端和客户端代码,并运行它们。
这样,你就可以在本地不同的进程之间通过Socket实现通信了。可以根据需要自定义数据交互的格式和协议。
内容由零声教学AI助手提供,问题来源于学员提问