套接字编程 - 更改套接字IP

时间:2015-10-08 01:41:47

标签: c linux sockets nic

注意:问题已被修改。

关于伯克利插座编程我几乎没有问题:

  1. 绑定后是否可以更改套接字地址?如果是这样 - 有什么C命令呢?

    2.根据https://www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html,当套接字绑定到INADDR_ANY时,它接收来自所有接口的数据包,但是当发送数据包时(使用发送命令),它通过具有默认IP的单个NIC发送

    如果我理解正确 - 如果服务器有两个具有不同IP的活动NIC,则具有INADDR_ANY参数的套接字可以接收dst IP = x的数据包并发送一个src IP = y的数据包,其中x不是年。这可能会导致问题,例如在TCP连接中,其他目标中的套接字将接收数据包,但由于目标IP不是预期的IP而将丢弃它。

    这是真的吗?如果是这样 - 这是否意味着服务器程序不使用INADDR_ANY,其中有两个或多个具有不同IP的活动NIC?

  2. 假设默认IP的NIC导致瓶颈。我们可以更改套接字选项,以便数据包将通过另一个NIC(而不是之前的NIC)发送吗?如果NIC具有默认IP地址,我们可以这样做吗?

  3. 我们可以通过一个网卡发送数据包,并将IP目的地设置为另一个网卡吗? (即,NIC1仅发送数据包,NIC2仅接收数据包)

1 个答案:

答案 0 :(得分:3)

  

是否可以在创建后更改套接字地址?

套接字在创建时没有要更改的IP地址。他们在绑定时得到一个。

  

如果是这样的话 - 有什么C命令可以这样做?

Berkeley套接字API函数这样做是bind()connect()

  

当套接字绑定到INADDR_ANY时,它会从所有接口接收数据包,但通过具有默认IP的单个NIC发送。

没有。它通过在每种情况下到达目标所需的任何NIC发送数据包。

Your cited source区别对待。绑定到INADDR_ANY的套接字从任何接口接收数据包。任何'之间没有区别。和所有'就INADDR_ANY而言。任何'都容易理解。

  

如果我理解正确 - 如果服务器有两个具有不同IP的活动NIC,则具有INADDR_ANY参数的套接字可以接收dst IP = x的数据包并发送一个src IP = y的数据包,其中x不是ÿ

没有。它使用客户端最初连接的相同源地址发送数据包。这是定义连接的部分原因。

  

这可能会导致问题,例如在TCP连接中,其他目标中的套接字将接收数据包,但会因为目标IP不是预期的IP而丢弃它。

没有。数据包中的目的地是客户端的IP地址。否则它甚至不会到达那里。这只是胡说八道。如果您的意思是源IP,请参阅上文。

  

是真的吗?

没有

  

如果是这样的话,是否意味着服务器程序不使用INADDR_ANY,其中有两个或多个具有不同IP的活动NIC?

没有。 INADDR_ANY正是它所说的。 任何 IP地址:任何NIC。

  

假设默认IP的NIC导致瓶颈。我们可以更改套接字选项,以便通过另一个NIC(而不是以前的NIC)发送数据包吗?

不,但您可以更改IP路由表。

  

如果NIC具有默认IP地址,我们可以这样做吗?

其中只有一个可以拥有默认IP地址。这个问题没有意义。

  

我们可以通过一个网卡发送数据包,并将目的地设置为另一个网卡吗?

只有你自己发送给自己。否则这个问题没有意义。

  

(来自您的引文)发送时,与INADDR_ANY绑定的套接字绑定到默认IP地址,即接口编号最小的IP地址

我希望这指的是正在描述的模拟器。如果它是对TCP如何工作的描述,那就错了。