我在Windows 7上,在connect之前使用SO_REUSEADDR,并将本地地址结构设置为IP地址INADDR _ANY和端口0(0),以便操作系统为客户端套接字选择源详细信息。
首先,我读到在连接到服务器之前不可能获得源IP,因为它是在此时被选择的,并且有几个地址是有效的。但是端口是在连接之前选择的,那么有什么方法可以获得它吗?(getsockname()看起来不起作用)。
其次,关于源IP,是否有办法在数据包发送到服务器之前获得它?我需要在操作系统选择源IP的那一刻和它开始三次握手之间的特定时间。connect()函数控制着这两者。
发布于 2015-03-29 23:35:52
我在Windows 7上,在
connect和SO_REUSEADDR之前使用SO_REUSEADDR
为什么在这种情况下使用SO_REUSEADDR?你不需要它,你的尝试也没有任何意义。SO_REUSEADDR通常应该只用于侦听套接字,而不是连接套接字。
将本地地址结构设置为IP地址INADDR _ANY和端口0(0),以便操作系统为客户端套接字选择源详细信息。
对于bind() (客户端套接字到INADDR_ANY:0 )来说这是毫无意义的。您可以(而且应该)完全省略这样的bind(),并让套接字不绑定,直到调用connect()为止。只有当您希望将客户端套接字绑定到特定的本地IP和/或端口时,才应该使用bind()。但在这种情况下你不能这么做,所以把它处理掉。
首先,我读到在连接到服务器之前不可能获得源IP,因为它是在此时被选择的,并且有几个地址是有效的。
正确,除非您bind()到特定的源IP。
但是端口是在连接之前选择的。
如果套接字未绑定,则源IP和源端口都由connect()选择,或者绑定到源IP INADDR_ANY和/或源端口0。因此,在connect()选择它们之前,您没有机会查询这两个值。
那么有什么方法可以得到它吗?(
getsockname()看上去不起作用)。
getsockname()正是你所需要的。只需确保在connect()成功地先连接到服务器之前才调用它。在getsockname()文档中说明了这一点:
在没有先执行绑定的情况下进行连接调用时,此调用特别有用;getsockname函数提供了确定系统已设置的本地关联的唯一方法。 ..。 -- getsockname函数在套接字绑定到未指定地址时并不总是返回有关主机地址的信息,除非套接字已连接到连接或接受(例如,使用ADDR_ANY)。除非套接字连接到,否则Windows应用程序不能假定该地址将被指定为。将用于套接字的地址是未知的,除非套接字在多宿主主机中使用时是连接的。如果套接字使用的是无连接协议,则在套接字上发生I/O之前,地址可能不可用。
其次,关于源IP,是否有办法在数据包发送到服务器之前获得它?
对于TCP,可以在getsockname()成功连接到服务器后立即使用connect()检索选定的源IP。不是以前。
我需要在操作系统选择源IP的那一刻和它开始三次握手之间的特定时间。
不可能确定这一细节。任何套接字应用程序都不应该需要这样的细节。你为什么需要它?
发布于 2015-03-29 18:23:49
我在Windows 7上,在连接SO_REUSEADDR之前使用bind,并将本地地址结构设置为IP地址INADDR _ANY和端口0(0),以便操作系统为客户端套接字选择源详细信息。
为什么?如果您根本不调用bind(),那么这正是所发生的情况,在connect().绑定客户端套接字到INADDR_ANY的过程中,无论如何都是不正确的。如果不指定非零端口号,设置SO_REUSEADDR也是没有意义的。把这些都拿掉。
首先,我读到在连接到服务器之前不可能获得源IP,因为它是在此时被选择的,并且有几个地址是有效的。
对,是这样。
但是端口是在连接之前选择的,那么有什么方法可以得到它吗?
是。getsockname().
(getsockname()看起来不起作用)
怎么不起作用?
其次,关于源IP,是否有办法在数据包发送到服务器之前获得它?
一旦getsockname()成功,您就可以使用connect()获得它,但这涉及到向服务器发送数据包。
我需要在操作系统选择源IP的那一刻和它开始三次握手之间的特定时间。connect()函数控制着这两者。
真不走运。
https://stackoverflow.com/questions/29331726
复制相似问题