【问题标题】:Connect function in raw socket?原始套接字中的连接功能?
【发布时间】:2017-05-13 03:39:06
【问题描述】:

我正在尝试在 C 中启动 TCP 三向握手。但是,我想到 connect 可能已经在建立这样的连接或以某种方式进行干扰。每当调用它的套接字设置了IPPROTO_TCP 选项时,connect 是否会自动建立 TCP 连接?

【问题讨论】:

  • 它还能做什么?奇怪的问题。

标签: c++ c sockets tcp raw-sockets


【解决方案1】:

是的,IPPROTO_TCP 创建 TCP 套接字。要使用原始套接字,您需要将 SOCK_RAW 作为第二个参数传递给 socket 函数。

【讨论】:

  • 好吧,我有第二个参数为SOCK_RAW,但它与IPPROTO_TCP 作为第三个参数相结合。回想起来,我应该澄清一下,我道歉。我想知道这两者将如何影响connect 的行为。
  • 在这种情况下,我不希望 connect 真正成功。我自己从未尝试过,但我预计它会失败。
  • 你为什么认为它不会成功?
  • @ArthurJames,因为connect 需要更高级别的套接字类型之一,例如“SOCK_STREAM”或“SOCK_DGRAM”类型,而不是SOCK_RAW。它在您的实验中有效吗?
【解决方案2】:

每个 MSDN 文档:

TCP/IP Raw Sockets

一旦应用程序创建了SOCK_RAW 类型的套接字,该套接字就可以用于发送和接收数据。 SOCK_RAW 类型的套接字上发送或接收的所有数据包都被视为未连接套接字上的数据报

以下规则适用于SOCK_RAW 套接字上的操作:

...

收到的数据报被复制到所有满足以下条件的SOCK_RAW套接字中:

...

  • 如果为套接字定义了一个外部地址,它应该对应于接收到的数据报的 IP 标头中指定的源地址。 应用程序可以通过调用connectWSAConnect 函数来指定外部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_INETAF_INET6 并且type 参数为SOCK_STREAM 时,这是一个可能的值。

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2015-02-25
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2022-01-06
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多