C/C++ 解析 docker 将服务组合到同一 IP
C/C++ resolving docker compose services to same IP
我正在尝试从 docker 撰写网络 运行 一个 C/C++ 套接字程序中的另一个容器解析某些 docker 撰写服务的 IP 地址.
这是我的 docker-compose.yml
version: "3.9"
services:
grad_calc_1:
image: worker:1
ports:
- "8080:8080"
environment:
- seed=10
grad_calc_2:
image: worker:1
ports:
- "8081:8080"
environment:
- seed=20
optimizer:
image: optimizer:1
depends_on:
- grad_calc_1
- grad_calc_2
这是我从 optimizer
服务解析主机名的代码
char* resolve_host(const char* host_name) {
struct hostent *host_entry;
char *IPbuffer;
host_entry = gethostbyname(host_name);
IPbuffer = inet_ntoa(*((struct in_addr*)host_entry->h_addr_list[0]));
return IPbuffer;
}
int main() {
const char* hostname_1 = "grad_calc_1";
const char* hostname_2 = "grad_calc_2";
char* ip_1 = resolve_host(hostname_1);
char* ip_2 = resolve_host(hostname_2);
cout << "grad_calc_1 IP: " << ip_1 << endl;
cout << "grad_calc_2 IP: " << ip_2 << endl;
}
两个主机名的输出都是 172.19.0.2
。我不确定我做错了什么
根据@KamilCuk 的评论,这里有一个可能的修复方法:
#include <string>
std::string resolve_host(const char* host_name) {
struct hostent *host_entry;
const char *IPbuffer;
host_entry = gethostbyname(host_name);
IPbuffer = inet_ntoa(*((struct in_addr*)host_entry->h_addr_list[0]));
return IPbuffer;
}
int main() {
const char* hostname_1 = "grad_calc_1";
const char* hostname_2 = "grad_calc_2";
std::string ip_1 = resolve_host(hostname_1);
std::string ip_2 = resolve_host(hostname_2);
cout << "grad_calc_1 IP: " << ip_1 << endl;
cout << "grad_calc_2 IP: " << ip_2 << endl;
}
这里的重点是在下一次调用覆盖它之前复制 inet_ntoa
返回的静态缓冲区。
inet_ntoa
returns 指向静态分配字符串的指针。 ip_1
和ip_2
都指向同一个内存。要么复制内存,要么一次使用一个。该行为已记录。
char* ip_1 = resolve_host(hostname_1);
cout << "grad_calc_1 IP: " << ip_1 << endl;
char* ip_2 = resolve_host(hostname_2);
cout << "grad_calc_2 IP: " << ip_2 << endl;
或喜欢
std::string ip_1{resolve_host(hostname_1)};
char* ip_2 = resolve_host(hostname_2);
cout << "grad_calc_1 IP: " << ip_1 << endl;
cout << "grad_calc_2 IP: " << ip_2 << endl;
我正在尝试从 docker 撰写网络 运行 一个 C/C++ 套接字程序中的另一个容器解析某些 docker 撰写服务的 IP 地址.
这是我的 docker-compose.yml
version: "3.9"
services:
grad_calc_1:
image: worker:1
ports:
- "8080:8080"
environment:
- seed=10
grad_calc_2:
image: worker:1
ports:
- "8081:8080"
environment:
- seed=20
optimizer:
image: optimizer:1
depends_on:
- grad_calc_1
- grad_calc_2
这是我从 optimizer
服务解析主机名的代码
char* resolve_host(const char* host_name) {
struct hostent *host_entry;
char *IPbuffer;
host_entry = gethostbyname(host_name);
IPbuffer = inet_ntoa(*((struct in_addr*)host_entry->h_addr_list[0]));
return IPbuffer;
}
int main() {
const char* hostname_1 = "grad_calc_1";
const char* hostname_2 = "grad_calc_2";
char* ip_1 = resolve_host(hostname_1);
char* ip_2 = resolve_host(hostname_2);
cout << "grad_calc_1 IP: " << ip_1 << endl;
cout << "grad_calc_2 IP: " << ip_2 << endl;
}
两个主机名的输出都是 172.19.0.2
。我不确定我做错了什么
根据@KamilCuk 的评论,这里有一个可能的修复方法:
#include <string>
std::string resolve_host(const char* host_name) {
struct hostent *host_entry;
const char *IPbuffer;
host_entry = gethostbyname(host_name);
IPbuffer = inet_ntoa(*((struct in_addr*)host_entry->h_addr_list[0]));
return IPbuffer;
}
int main() {
const char* hostname_1 = "grad_calc_1";
const char* hostname_2 = "grad_calc_2";
std::string ip_1 = resolve_host(hostname_1);
std::string ip_2 = resolve_host(hostname_2);
cout << "grad_calc_1 IP: " << ip_1 << endl;
cout << "grad_calc_2 IP: " << ip_2 << endl;
}
这里的重点是在下一次调用覆盖它之前复制 inet_ntoa
返回的静态缓冲区。
inet_ntoa
returns 指向静态分配字符串的指针。 ip_1
和ip_2
都指向同一个内存。要么复制内存,要么一次使用一个。该行为已记录。
char* ip_1 = resolve_host(hostname_1);
cout << "grad_calc_1 IP: " << ip_1 << endl;
char* ip_2 = resolve_host(hostname_2);
cout << "grad_calc_2 IP: " << ip_2 << endl;
或喜欢
std::string ip_1{resolve_host(hostname_1)};
char* ip_2 = resolve_host(hostname_2);
cout << "grad_calc_1 IP: " << ip_1 << endl;
cout << "grad_calc_2 IP: " << ip_2 << endl;