|
@@ -2,6 +2,10 @@
|
|
|
|
|
|
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
|
|
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
|
|
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
|
|
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
|
|
|
|
+#define DLog(format, ...) \
|
|
|
|
+ #if DEBUG \
|
|
|
|
+ log_message(format, __VA_ARGS__); \
|
|
|
|
+ #endif
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
#include <pthread.h>
|
|
#include <pthread.h>
|
|
@@ -822,14 +826,14 @@ int read_message(int fd, void *buffer, int size, int target) {
|
|
int create_server_socket(int port) {
|
|
int create_server_socket(int port) {
|
|
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
|
|
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (server_socket < 0) {
|
|
if (server_socket < 0) {
|
|
- log_message("创建套接字失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("创建套接字失败: %s", strerror(errno));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
// 设置套接字选项,允许地址重用
|
|
// 设置套接字选项,允许地址重用
|
|
int opt = 1;
|
|
int opt = 1;
|
|
if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
|
|
if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
|
|
- log_message("设置套接字选项失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("设置套接字选项失败: %s", strerror(errno));
|
|
close(server_socket);
|
|
close(server_socket);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -842,14 +846,14 @@ int create_server_socket(int port) {
|
|
server_addr.sin_port = htons(port);
|
|
server_addr.sin_port = htons(port);
|
|
|
|
|
|
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
|
|
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
|
|
- log_message("绑定套接字失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("绑定套接字失败: %s", strerror(errno));
|
|
close(server_socket);
|
|
close(server_socket);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
// 监听连接
|
|
// 监听连接
|
|
if (listen(server_socket, 5) < 0) {
|
|
if (listen(server_socket, 5) < 0) {
|
|
- log_message("监听套接字失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("监听套接字失败: %s", strerror(errno));
|
|
close(server_socket);
|
|
close(server_socket);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -868,11 +872,11 @@ int accept_connection(int server_socket) {
|
|
|
|
|
|
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len);
|
|
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len);
|
|
if (client_socket < 0) {
|
|
if (client_socket < 0) {
|
|
- log_message("接受连接失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("接受连接失败: %s", strerror(errno));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
- log_message("接受来自 %s:%d 的连接", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
|
|
|
|
|
|
+ DLog("接受来自 %s:%d 的连接", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
|
|
return client_socket;
|
|
return client_socket;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -885,7 +889,7 @@ int accept_connection(int server_socket) {
|
|
int connect_to_server(const char *ip, int port) {
|
|
int connect_to_server(const char *ip, int port) {
|
|
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
|
|
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (client_socket < 0) {
|
|
if (client_socket < 0) {
|
|
- log_message("创建套接字失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("创建套接字失败: %s", strerror(errno));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -895,13 +899,13 @@ int connect_to_server(const char *ip, int port) {
|
|
server_addr.sin_port = htons(port);
|
|
server_addr.sin_port = htons(port);
|
|
|
|
|
|
if (inet_pton(AF_INET, ip, &server_addr.sin_addr) <= 0) {
|
|
if (inet_pton(AF_INET, ip, &server_addr.sin_addr) <= 0) {
|
|
- log_message("无效的IP地址: %s", ip);
|
|
|
|
|
|
+ DLog("无效的IP地址: %s", ip);
|
|
close(client_socket);
|
|
close(client_socket);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
|
|
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
|
|
- log_message("连接到服务器失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("连接到服务器失败: %s", strerror(errno));
|
|
close(client_socket);
|
|
close(client_socket);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -925,7 +929,7 @@ int get_listening_ports(int *ports, int max_ports) {
|
|
// 使用netstat命令获取监听的TCP端口
|
|
// 使用netstat命令获取监听的TCP端口
|
|
fp = popen("netstat -tln | grep LISTEN", "r");
|
|
fp = popen("netstat -tln | grep LISTEN", "r");
|
|
if (fp == NULL) {
|
|
if (fp == NULL) {
|
|
- log_message("执行netstat命令失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("执行netstat命令失败: %s", strerror(errno));
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1015,7 +1019,7 @@ int send_handshake_message(int fd, int target) {
|
|
|
|
|
|
int result = write_message(fd, &message, sizeof(message));
|
|
int result = write_message(fd, &message, sizeof(message));
|
|
if (result > 0) {
|
|
if (result > 0) {
|
|
- log_message("已发送握手消息到%s", target == 0 ? "host" : "client");
|
|
|
|
|
|
+ DLog("已发送握手消息到%s", target == 0 ? "host" : "client");
|
|
}
|
|
}
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
@@ -1120,13 +1124,13 @@ void update_ports() {
|
|
|
|
|
|
// 如果端口列表有变化,更新并通知host
|
|
// 如果端口列表有变化,更新并通知host
|
|
if (changed) {
|
|
if (changed) {
|
|
- log_message("端口列表已更新,共 %d 个端口", new_num_ports);
|
|
|
|
|
|
+ DLog("端口列表已更新,共 %d 个端口", new_num_ports);
|
|
|
|
|
|
// 更新本地端口列表
|
|
// 更新本地端口列表
|
|
num_ports = new_num_ports;
|
|
num_ports = new_num_ports;
|
|
for (int i = 0; i < num_ports; i++) {
|
|
for (int i = 0; i < num_ports; i++) {
|
|
ports[i] = new_ports[i];
|
|
ports[i] = new_ports[i];
|
|
- log_message("监听端口: %d", ports[i]);
|
|
|
|
|
|
+ DLog("监听端口: %d", ports[i]);
|
|
}
|
|
}
|
|
|
|
|
|
// 发送端口更新消息给host
|
|
// 发送端口更新消息给host
|
|
@@ -1151,13 +1155,13 @@ void handle_new_connection(NewConnectionMessage *message) {
|
|
int connection_id = message->header.connection_id;
|
|
int connection_id = message->header.connection_id;
|
|
int port = message->header.port;
|
|
int port = message->header.port;
|
|
|
|
|
|
- log_message("收到新连接请求: ID=%d, 端口=%d, 客户端=%s:%d",
|
|
|
|
|
|
+ DLog("收到新连接请求: ID=%d, 端口=%d, 客户端=%s:%d",
|
|
connection_id, port, message->client_ip, message->client_port);
|
|
connection_id, port, message->client_ip, message->client_port);
|
|
|
|
|
|
// 连接到本地服务
|
|
// 连接到本地服务
|
|
int socket_fd = connect_to_server("127.0.0.1", port);
|
|
int socket_fd = connect_to_server("127.0.0.1", port);
|
|
if (socket_fd < 0) {
|
|
if (socket_fd < 0) {
|
|
- log_message("无法连接到本地服务: 端口=%d", port);
|
|
|
|
|
|
+ DLog("无法连接到本地服务: 端口=%d", port);
|
|
|
|
|
|
// 发送关闭连接消息
|
|
// 发送关闭连接消息
|
|
CloseConnectionMessage close_message;
|
|
CloseConnectionMessage close_message;
|
|
@@ -1177,7 +1181,7 @@ void handle_new_connection(NewConnectionMessage *message) {
|
|
int *thread_arg = malloc(sizeof(int));
|
|
int *thread_arg = malloc(sizeof(int));
|
|
*thread_arg = connection_id;
|
|
*thread_arg = connection_id;
|
|
if (pthread_create(&thread, NULL, connection_handler_thread, thread_arg) != 0) {
|
|
if (pthread_create(&thread, NULL, connection_handler_thread, thread_arg) != 0) {
|
|
- log_message("创建连接处理线程失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("创建连接处理线程失败: %s", strerror(errno));
|
|
free_connection_id(connection_id);
|
|
free_connection_id(connection_id);
|
|
free(thread_arg);
|
|
free(thread_arg);
|
|
return;
|
|
return;
|
|
@@ -1195,14 +1199,14 @@ void handle_data_message(DataMessage *message) {
|
|
int socket_fd = get_connection_socket(connection_id);
|
|
int socket_fd = get_connection_socket(connection_id);
|
|
|
|
|
|
if (socket_fd < 0) {
|
|
if (socket_fd < 0) {
|
|
- log_message("无效的连接ID: %d", connection_id);
|
|
|
|
|
|
+ DLog("无效的连接ID: %d", connection_id);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
// 将数据发送到本地服务
|
|
// 将数据发送到本地服务
|
|
int bytes_sent = write(socket_fd, message->data, message->header.data_size);
|
|
int bytes_sent = write(socket_fd, message->data, message->header.data_size);
|
|
if (bytes_sent < 0) {
|
|
if (bytes_sent < 0) {
|
|
- log_message("发送数据到本地服务失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("发送数据到本地服务失败: %s", strerror(errno));
|
|
|
|
|
|
// 发送关闭连接消息
|
|
// 发送关闭连接消息
|
|
CloseConnectionMessage close_message;
|
|
CloseConnectionMessage close_message;
|
|
@@ -1222,7 +1226,7 @@ void handle_data_message(DataMessage *message) {
|
|
*/
|
|
*/
|
|
void handle_close_connection(CloseConnectionMessage *message) {
|
|
void handle_close_connection(CloseConnectionMessage *message) {
|
|
int connection_id = message->header.connection_id;
|
|
int connection_id = message->header.connection_id;
|
|
- log_message("关闭连接: ID=%d", connection_id);
|
|
|
|
|
|
+ DLog("关闭连接: ID=%d", connection_id);
|
|
free_connection_id(connection_id);
|
|
free_connection_id(connection_id);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1259,7 +1263,7 @@ void *connection_handler_thread(void *arg) {
|
|
int bytes_read = read(socket_fd, buffer, MAX_BUFFER_SIZE);
|
|
int bytes_read = read(socket_fd, buffer, MAX_BUFFER_SIZE);
|
|
if (bytes_read <= 0) {
|
|
if (bytes_read <= 0) {
|
|
if (bytes_read < 0) {
|
|
if (bytes_read < 0) {
|
|
- log_message("从本地服务读取数据失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("从本地服务读取数据失败: %s", strerror(errno));
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1292,7 +1296,7 @@ void *connection_handler_thread(void *arg) {
|
|
* @param message 握手消息
|
|
* @param message 握手消息
|
|
*/
|
|
*/
|
|
void handle_handshake_message(HandshakeMessage *message) {
|
|
void handle_handshake_message(HandshakeMessage *message) {
|
|
- log_message("收到来自host的握手消息,host已上线");
|
|
|
|
|
|
+ DLog("收到来自host的握手消息,host已上线");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1334,7 +1338,7 @@ void *message_handler_thread(void *arg) {
|
|
break;
|
|
break;
|
|
|
|
|
|
default:
|
|
default:
|
|
- log_message("未知的消息类型: %d", header->type);
|
|
|
|
|
|
+ DLog("未知的消息类型: %d", header->type);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1349,7 +1353,7 @@ void *message_handler_thread(void *arg) {
|
|
* @return 退出码
|
|
* @return 退出码
|
|
*/
|
|
*/
|
|
int vmnetproxy_main() {
|
|
int vmnetproxy_main() {
|
|
- log_message("VMNet Proxy Client 启动");
|
|
|
|
|
|
+ DLog("VMNet Proxy Client 启动");
|
|
|
|
|
|
// 初始化连接映射表
|
|
// 初始化连接映射表
|
|
init_connection_map();
|
|
init_connection_map();
|
|
@@ -1357,31 +1361,31 @@ int vmnetproxy_main() {
|
|
// 打开代理文件
|
|
// 打开代理文件
|
|
proxy_fd = open_proxy_file(0);
|
|
proxy_fd = open_proxy_file(0);
|
|
if (proxy_fd < 0) {
|
|
if (proxy_fd < 0) {
|
|
- log_message("无法打开代理文件,退出");
|
|
|
|
|
|
+ DLog("无法打开代理文件,退出");
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
// 清空消息队列
|
|
// 清空消息队列
|
|
if (clear_message_queue(proxy_fd) < 0) {
|
|
if (clear_message_queue(proxy_fd) < 0) {
|
|
- log_message("清空消息队列失败,继续执行");
|
|
|
|
|
|
+ DLog("清空消息队列失败,继续执行");
|
|
}
|
|
}
|
|
|
|
|
|
// 发送握手消息给host
|
|
// 发送握手消息给host
|
|
if (send_handshake_message(proxy_fd, 0) < 0) {
|
|
if (send_handshake_message(proxy_fd, 0) < 0) {
|
|
- log_message("发送握手消息失败,继续执行");
|
|
|
|
|
|
+ DLog("发送握手消息失败,继续执行");
|
|
}
|
|
}
|
|
|
|
|
|
// 创建端口监控线程
|
|
// 创建端口监控线程
|
|
pthread_t port_thread;
|
|
pthread_t port_thread;
|
|
if (pthread_create(&port_thread, NULL, port_monitor_thread, NULL) != 0) {
|
|
if (pthread_create(&port_thread, NULL, port_monitor_thread, NULL) != 0) {
|
|
- log_message("创建端口监控线程失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("创建端口监控线程失败: %s", strerror(errno));
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
// 创建消息处理线程
|
|
// 创建消息处理线程
|
|
pthread_t message_thread;
|
|
pthread_t message_thread;
|
|
if (pthread_create(&message_thread, NULL, message_handler_thread, NULL) != 0) {
|
|
if (pthread_create(&message_thread, NULL, message_handler_thread, NULL) != 0) {
|
|
- log_message("创建消息处理线程失败: %s", strerror(errno));
|
|
|
|
|
|
+ DLog("创建消息处理线程失败: %s", strerror(errno));
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|