代码之家  ›  专栏  ›  技术社区  ›  Bogdan Gavril MSFT

一台机器有两个NIC。连接到插座时将使用哪一个?

  •  7
  • Bogdan Gavril MSFT  · 技术社区  · 17 年前

    假设我创建了一个非常简单的套接字连接,那么如何通过编程实现:

    1. 找出什么接口(IP地址 /nic)正在使用。
    2. 强制另一个接口
    3 回复  |  直到 12 年前
        1
  •  13
  •   j_random_hacker    17 年前

    无论您使用什么语言,您最终都将使用一个套接字库,该库位于原始实现之上 BSD插座 C网络库。尽管您可能需要为不同的库和语言更改某些内容,但以下信息至少有助于确定在库文档中查找的位置。

    服务器

    通常,服务器程序发出以下调用序列:

    1. socket() 返回“浮动”套接字对象。
    2. bind() 将套接字绑定到机器中所有网络接口卡(NIC)上的特定已知端口号。
    3. listen() 使插座“带电”。
    4. accept() 在与客户机建立连接之前阻止。

    您可以决定使用哪个NIC的点在呼叫中 绑定() ,它需要包含IP地址和端口号的数据结构。通常的策略是传递特殊值 INADDR_ANY 对于IP地址,表示连接应该使用机器中的任何和所有NIC,但是可以指定一个特定的NIC的IP来仅通过该NIC接收连接。

    客户

    通常,客户机程序发出以下调用序列:

    1. 套接字() 返回“浮动”套接字对象。
    2. connect() 将套接字绑定到随机选择的NIC上的随机选择端口,并尝试连接到远程 host:port 指定的组合。

    那么客户机如何选择要使用的NIC呢?客户也可以选择呼叫 绑定() 如果它愿意,在 套接字() 以前 连接() . 通常这不是因为 连接() 将自动绑定未绑定的套接字,使其能够通过任何NIC访问(通常是所需的行为),但可以通过调用 绑定() 明确地。在这种情况下,您应该为端口号指定0,让操作系统为您选择一个随机端口号。

    连接完成后,您可以拨打 getsockname() 获取有关套接字的信息,例如它绑定到哪个IP(即它通过哪个NIC通信)以及分配了什么端口号(在客户机程序的情况下)。

        2
  •  2
  •   Darron    17 年前

    A.建立连接后,大多数套接字API都会调用“getlocaladdress”之类的东西,它将告诉您操作系统为您选择的接口。

    B.类似地,在创建套接字之后,但在建立连接之前,大多数套接字API都有一个将套接字绑定到本地地址和/或端口的调用。

        3
  •  1
  •   Filip Ekberg    17 年前

    你会发现这些链接很有用,因为问题没有提供语言,这里是最常见的。

    Socket Programming in C

    Socket Programming in C#

    Socket Programming in Java

    Socket Programming in Python

    所以,使用这些链接中的任何一个,并转到您正在使用的语言。找到获取主机地址或IP地址的函数,并使用相应语言的bind方法。这将强制应用程序绑定到该接口。

    推荐文章