在原始套接字中连接功能?

时间:2016-12-28 20:14:42

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

根据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数据。   ...

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

  •   

因此,您无法使用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 时,这是一个可能的值。