假设我创建了一个非常简单的套接字连接,如何以编程方式:
找出正在使用的接口(IP地址/ NIC).
强制其他界面
j_random_hac.. 13
无论您使用何种语言,您最终都将使用在原始BSD套接字 C网络库的实现之上分层的套接字库.虽然您可能需要针对不同的库和语言更改某些内容,但以下信息至少应有助于确定在库的文档中查找的位置.
通常,服务器程序发出以下调用序列:
socket()
返回一个"浮动"套接字对象.
bind()
将套接字绑定到(通常)机器中所有网络接口卡(NIC)上的特定已知端口号.
listen()
使套接字"活".
accept()
阻止直到与客户端计算机建立连接.
您可以决定使用哪个NIC的位置在调用中bind()
,这需要包含IP地址和端口号的数据结构.通常的策略是传递INADDR_ANY
IP地址的特殊值,表明连接应该使用机器中的任何和所有NIC,但是可以指定特定NIC的IP来仅通过该NIC接收连接.
通常,客户端程序发出以下调用序列:
socket()
返回一个"浮动"套接字对象.
connect()
将套接字绑定到随机选择的NIC上随机选择的端口,并尝试连接到host:port
指定的远程组合.
那么客户如何选择使用哪种NIC?客户也可以选择bind()
在socket()
之前和之后打电话connect()
.通常这不是简单的原因,因为它connect()
会以允许通过任何NIC访问的方式自动绑定未绑定的套接字(这通常是所需的行为),但可以通过bind()
显式调用来关闭此自动绑定.在这种情况下,您应该为端口号指定0,以便操作系统为您选择随机端口号.
建立连接后,您可以调用getsockname()
以获取有关套接字的信息,例如绑定到哪个IP(即通过哪个NIC)以及分配了哪个端口号(如果是客户端程序).
无论您使用何种语言,您最终都将使用在原始BSD套接字 C网络库的实现之上分层的套接字库.虽然您可能需要针对不同的库和语言更改某些内容,但以下信息至少应有助于确定在库的文档中查找的位置.
通常,服务器程序发出以下调用序列:
socket()
返回一个"浮动"套接字对象.
bind()
将套接字绑定到(通常)机器中所有网络接口卡(NIC)上的特定已知端口号.
listen()
使套接字"活".
accept()
阻止直到与客户端计算机建立连接.
您可以决定使用哪个NIC的位置在调用中bind()
,这需要包含IP地址和端口号的数据结构.通常的策略是传递INADDR_ANY
IP地址的特殊值,表明连接应该使用机器中的任何和所有NIC,但是可以指定特定NIC的IP来仅通过该NIC接收连接.
通常,客户端程序发出以下调用序列:
socket()
返回一个"浮动"套接字对象.
connect()
将套接字绑定到随机选择的NIC上随机选择的端口,并尝试连接到host:port
指定的远程组合.
那么客户如何选择使用哪种NIC?客户也可以选择bind()
在socket()
之前和之后打电话connect()
.通常这不是简单的原因,因为它connect()
会以允许通过任何NIC访问的方式自动绑定未绑定的套接字(这通常是所需的行为),但可以通过bind()
显式调用来关闭此自动绑定.在这种情况下,您应该为端口号指定0,以便操作系统为您选择随机端口号.
建立连接后,您可以调用getsockname()
以获取有关套接字的信息,例如绑定到哪个IP(即通过哪个NIC)以及分配了哪个端口号(如果是客户端程序).