【问题标题】:A machine has 2 NICs. Which one will be utilized when connecting to a socket?一台机器有 2 个网卡。连接到套接字时将使用哪一个?
【发布时间】:2013-09-03 22:29:22
【问题描述】:

假设我创建了一个非常简单的套接字连接,如何以编程方式进行:

  1. 找出什么接口(IP地址 /NIC) 正在使用中。
  2. 强制其他接口

【问题讨论】:

  • 如果您想回答您的问题,您需要指定编程语言和操作系统。
  • 同意,这在大多数语言中都很简单,但您需要指定您的工作内容。
  • 你在连接还是在听?
  • @Rich:OP 谈论“套接字”。这不总是意味着 BSD 套接字,它们在每个平台上以基本相同的方式实现吗?
  • @j_random_hacker:嗯。如果你认为 Java、C# 和 C 都以相同的方式处理套接字,那你就大错特错了。

标签: sockets


【解决方案1】:

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

服务器

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

  1. socket() 返回一个“浮动”套接字对象。
  2. bind() 将套接字绑定到机器中(通常)所有网络接口卡 (NIC) 上的特定已知端口号。
  3. listen() 使套接字“激活”。
  4. accept() 阻塞,直到与客户端计算机建立连接。

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

客户

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

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

那么客户端如何选择使用什么网卡呢?如果客户愿意,也可以选择在socket() 之后和connect() 之前调用bind()。通常这不会简单地完成,因为connect() 将自动绑定未绑定的套接字,从而可以通过任何 NIC 进行访问(这通常是所需的行为),但是可以通过显式调用 bind() 来关闭此自动绑定.在这种情况下,您应该将端口号指定为 0,让操作系统为您选择一个随机端口号。

一旦建立连接,您可以调用getsockname() 以获取有关套接字的信息,例如它绑定到哪个 IP(即它正在通过哪个 NIC 进行通信)以及分配的端口号(在这种情况下)客户端程序)。

【讨论】:

    【解决方案2】:

    一个。建立连接后,大多数套接字 API 都会调用“getLocalAddress”之类的内容,它会告诉您操作系统为您选择的接口。

    b.同样,在创建套接字之后但在建立连接之前,大多数套接字 API 都会调用将套接字绑定到本地地址和/或端口。

    【讨论】:

      【解决方案3】:

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

      Socket Programming in C

      Socket Programming in C#

      Socket Programming in Java

      Socket Programming in Python

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-23
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        • 2012-12-16
        • 2015-08-02
        相关资源
        最近更新 更多