我正在尝试在C中启动TCP三向握手。但是,我发现connect
可能已经建立了这种连接或以某种方式干扰。 connect
每当被调用的套接字设置IPPROTO_TCP
选项时,它是否会自动建立TCP连接?
答案 0 :(得分:1)
是的,IPPROTO_TCP
创建TCP套接字。要使用原始套接字,您需要将SOCK_RAW作为第二个参数传递给socket
函数。
答案 1 :(得分:0)
根据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数据。 ...
不允许使用
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_INET
或AF_INET6
且type
参数为SOCK_STREAM
时,这是一个可能的值。