当前位置:  开发笔记 > 运维 > 正文

一台机器有2个NIC.连接到插座时会使用哪一个?

如何解决《一台机器有2个NIC.连接到插座时会使用哪一个?》经验,为你挑选了1个好方法。

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

    找出正在使用的接口(IP地址/ NIC).

    强制其他界面

j_random_hac.. 13

无论您使用何种语言,您最终都将使用在原始BSD套接字 C网络库的实现之上分层的套接字库.虽然您可能需要针对不同的库和语言更改某些内容,但以下信息至少应有助于确定在库的文档中查找的位置.

服务器

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

    socket() 返回一个"浮动"套接字对象.

    bind() 将套接字绑定到(通常)机器中所有网络接口卡(NIC)上的特定已知端口号.

    listen() 使套接字"活".

    accept() 阻止直到与客户端计算机建立连接.

您可以决定使用哪个NIC的位置在调用中bind(),这需要包含IP地址和端口号的数据结构.通常的策略是传递INADDR_ANYIP地址的特殊值,表明连接应该使用机器中的任何和所有NIC,但是可以指定特定NIC的IP来仅通过该NIC接收连接.

客户端

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

    socket() 返回一个"浮动"套接字对象.

    connect()将套接字绑定到随机选择的NIC上随机选择的端口,并尝试连接到host:port指定的远程组合.

那么客户如何选择使用哪种NIC?客户也可以选择bind()socket()之前和之后打电话connect().通常这不是简单的原因,因为它connect()会以允许通过任何NIC访问的方式自动绑定未绑定的套接字(这通常是所需的行为),但可以通过bind()显式调用来关闭此自动绑定.在这种情况下,您应该为端口号指定0,以便操作系统为您选择随机端口号.

建立连接后,您可以调用getsockname()以获取有关套接字的信息,例如绑定到哪个IP(即通过哪个NIC)以及分配了哪个端口号(如果是客户端程序).



1> j_random_hac..:

无论您使用何种语言,您最终都将使用在原始BSD套接字 C网络库的实现之上分层的套接字库.虽然您可能需要针对不同的库和语言更改某些内容,但以下信息至少应有助于确定在库的文档中查找的位置.

服务器

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

    socket() 返回一个"浮动"套接字对象.

    bind() 将套接字绑定到(通常)机器中所有网络接口卡(NIC)上的特定已知端口号.

    listen() 使套接字"活".

    accept() 阻止直到与客户端计算机建立连接.

您可以决定使用哪个NIC的位置在调用中bind(),这需要包含IP地址和端口号的数据结构.通常的策略是传递INADDR_ANYIP地址的特殊值,表明连接应该使用机器中的任何和所有NIC,但是可以指定特定NIC的IP来仅通过该NIC接收连接.

客户端

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

    socket() 返回一个"浮动"套接字对象.

    connect()将套接字绑定到随机选择的NIC上随机选择的端口,并尝试连接到host:port指定的远程组合.

那么客户如何选择使用哪种NIC?客户也可以选择bind()socket()之前和之后打电话connect().通常这不是简单的原因,因为它connect()会以允许通过任何NIC访问的方式自动绑定未绑定的套接字(这通常是所需的行为),但可以通过bind()显式调用来关闭此自动绑定.在这种情况下,您应该为端口号指定0,以便操作系统为您选择随机端口号.

建立连接后,您可以调用getsockname()以获取有关套接字的信息,例如绑定到哪个IP(即通过哪个NIC)以及分配了哪个端口号(如果是客户端程序).

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有