【问题标题】:C open socket on a specific IPC 在特定 IP 上打开套接字
【发布时间】:2023-03-19 09:00:01
【问题描述】:

可以使用 2 个不同的静态 IP (IPv4) 中的任何一个访问我的网站。

是否可以打开与另一台服务器的 TCP 连接,指定使用 2 个 IP 中的哪一个作为返回地址?

x.x.x.x(我的服务器)=> z.z.z.z(目标服务器)
y.y.y.y(我的服务器)=> z.z.z.z(目标服务器)

为简单起见,省略了此示例中的错误检查等:

struct addrinfo hints, *result;
hints.ai_flags = 0;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_addrlen = 0;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;

getaddrinfo(domain, "80", &hints, &result);

socket(result->ai_family, result->ai_socktype, result->ai_protocol);

【问题讨论】:

    标签: c linux sockets posix


    【解决方案1】:

    不确定,但您不能在连接之前将您的套接字bind 连接到您的本地地址之一吗?在这种情况下,您可以选择使用哪个 IP 进行连接。

    【讨论】:

      【解决方案2】:

      就像@hochl 所说,您使用bind 系统调用:

      struct sockaddr_in sin = { 0 };
      int sock;
      
      /* Create a socket address, with a specific port and (local) ipnumber */
      sin.sin_family = AF_INET;
      sin.sin_port = htons(80);
      inet_aton("1.2.3.4", &sin.sin_addr);
      
      /* Create socket */
      sock = socket(AF_INET, SOCK_STREAM, 0);
      
      /* Bind socket to the local address */
      bind(sock, (struct sockaddr *) &sin, sizeof(sin));
      
      /* Now connect to remote server... */
      /* connect(...) */
      

      应该注意的是,通常不鼓励使用inet_aton,而是使用inet_pton

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 2012-02-16
        相关资源
        最近更新 更多