在原始套筒中连接功能

Connect function in raw socket?

本文关键字:连接 功能 原始      更新时间:2023-10-16

我正在尝试在C中启动TCP三向式弹药。但是,我想到connect可能已经在建立了这种连接或以某种方式进行干扰。connect是否每当插座上都有IPPROTO_TCP选项设置时会自动建立TCP连接?

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

per msdn文档:

TCP/IP RAW插座

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

以下规则适用于SOCK_RAW插座的操作:

...

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

...

  • 如果为套接字定义了外国地址,则应对应于收到数据报的IP标头中指定的源地址。应用程序可以通过调用connectWSAConnect函数来指定外国IP地址。如果未为套接字指定外国IP地址,则数据报将被复制到套接字中,无论收到的数据报的IP标头中的源IP地址如何。

这意味着原始插座本质上是无连接的插座,因此connect() 不会在原始插座上执行3路TCP握手。它只是将一个远程地址与套接字关联,类似于connect()与UDP(SOCK_DGRAM)套接字一起工作的方式。

更重要的是:

原始插座的限制

...

  • TCP数据无法通过原始插座发送。 ...

  • 不允许使用IPPROTO_TCP协议的RAW套接字来调用bind函数。

因此,您不能将IPPROTO_TCP与RAW套接字开始使用,因此在RAW TCP套接字上的connect()行为问题是没有的。IPPROTO_TCP只能与真实的TCP(SOCK_STREAM)插座一起使用:

ipproto_tcp
6

传输控制协议(TCP)。当af参数为AF_INETAF_INET6 并且type参数为SOCK_STREAM

时,这是可能的值