Sockets Windows Tracert tcp

Sockets Windows Tracert tcp,sockets,tcp,winsock,Sockets,Tcp,Winsock,我正在尝试在Windows上使用tcp实现tracert。我在用Winsock。我使用的套接字是SOCK\u流 问题是如何使用下一个TTL获取主机的地址。就我所知,在这种情况下我不能使用recvfrom函数,因为TCP是基于连接的协议,所以recv等于recvfrom。 我尝试使用getpeername,但仍然只能获得目标节点的IP地址 而且。即使将TTL=0设置为IP数据包,结果仍然会到达目标计算机,我也会得到响应。tracert(或traceroute)不适用于TCP,但适用于ICMP(如p

我正在尝试在Windows上使用tcp实现tracert。我在用Winsock。我使用的套接字是SOCK\u流

问题是如何使用下一个TTL获取主机的地址。就我所知,在这种情况下我不能使用recvfrom函数,因为TCP是基于连接的协议,所以recv等于recvfrom。 我尝试使用getpeername,但仍然只能获得目标节点的IP地址

而且。即使将TTL=0设置为IP数据包,结果仍然会到达目标计算机,我也会得到响应。

tracert
(或
traceroute
)不适用于TCP,但适用于ICMP(如
ping
)。TTL应以1开始,然后递增1,直到到达目的地


更多信息可以在

上找到,这是真的,但不是我要问的。我已经使用ICMP请求实现了tracert。现在我想使用TCP请求实现它,并捕获ICMP响应,告知TTL=0,使用与TTL递增相同的技术。您可以在Linux中使用命令tcptraceroute来实现这一点:实际上
traceroute
(Linux)与TCP一起工作。请参阅
-T
选项。它使用一个TCP SYN通过可能阻塞ICMP的路由器。您可以使用
-p
以特定端口为目标。您可以发布部分无法按预期方式工作的代码吗?也许将tcptraceroute移植到windows也比从头开始编写要容易。主要的问题是,据我所知,无论发送传输协议是什么,您仍然需要创建一个接收ICMP套接字来获取“TTL超出”消息。但您只能创建原始ICMP套接字。你必须有它的管理员权限。另一个机会是使用winpcap lib,但安装驱动程序也需要管理员权限。我更喜欢不需要管理员权限的方式,我会建议重写这个问题,或者针对这个特定的问题提出一个新的问题。但据我所知(或阅读),winsock需要原始套接字的管理权限(“在Windows NT上,原始套接字支持需要管理权限”,位于页面中间一点之后)。