【发布时间】:2017-05-13 03:39:06
【问题描述】:
我正在尝试在 C 中启动 TCP 三向握手。但是,我想到 connect 可能已经在建立这样的连接或以某种方式进行干扰。每当调用它的套接字设置了IPPROTO_TCP 选项时,connect 是否会自动建立 TCP 连接?
【问题讨论】:
-
它还能做什么?奇怪的问题。
标签: c++ c sockets tcp raw-sockets
我正在尝试在 C 中启动 TCP 三向握手。但是,我想到 connect 可能已经在建立这样的连接或以某种方式进行干扰。每当调用它的套接字设置了IPPROTO_TCP 选项时,connect 是否会自动建立 TCP 连接?
【问题讨论】:
标签: c++ c sockets tcp raw-sockets
是的,IPPROTO_TCP 创建 TCP 套接字。要使用原始套接字,您需要将 SOCK_RAW 作为第二个参数传递给 socket 函数。
【讨论】:
SOCK_RAW,但它与IPPROTO_TCP 作为第三个参数相结合。回想起来,我应该澄清一下,我道歉。我想知道这两者将如何影响connect 的行为。
connect 需要更高级别的套接字类型之一,例如“SOCK_STREAM”或“SOCK_DGRAM”类型,而不是SOCK_RAW。它在您的实验中有效吗?
每个 MSDN 文档:
一旦应用程序创建了
SOCK_RAW类型的套接字,该套接字就可以用于发送和接收数据。 在SOCK_RAW类型的套接字上发送或接收的所有数据包都被视为未连接套接字上的数据报。以下规则适用于
SOCK_RAW套接字上的操作:...
收到的数据报被复制到所有满足以下条件的
SOCK_RAW套接字中:...
- 如果为套接字定义了一个外部地址,它应该对应于接收到的数据报的 IP 标头中指定的源地址。 应用程序可以通过调用
connect或WSAConnect函数来指定外部IP 地址。如果没有为套接字指定外部 IP 地址,则将数据报复制到套接字中,而不管接收到的数据报的 IP 标头中的源 IP 地址。
这意味着 RAW 套接字本质上是无连接套接字,因此connect() 不在 RAW 套接字上执行 3 次 TCP 握手。它只是将远程地址与套接字相关联,类似于 connect() 与 UDP (SOCK_DGRAM) 套接字的工作方式。
更重要的是:
原始套接字的限制
...
无法通过原始套接字发送 TCP 数据。 ...
不允许使用
IPPROTO_TCP协议的原始套接字调用bind函数。
因此,您不能一开始就将IPPROTO_TCP 与RAW 套接字一起使用,因此RAW TCP 套接字上的connect() 行为问题没有实际意义。 IPPROTO_TCP can only be used with a real TCP (SOCK_STREAM) socket:
IPPROTO_TCP
6传输控制协议 (TCP)。当
af参数为AF_INET或AF_INET6并且type参数为SOCK_STREAM时,这是一个可能的值。
【讨论】: