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_1ip_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;