我知道windows下的tracert都是用raw套接口收发icmp报文来实现的, 但是unix下却是用udp套接口发送设置过ip头ttl的upd包, 然后用raw套接口接收ttl超时, 或者端口不可达等icmp报文。
  现在我在windows下也用unix方式来实现 -- 设置ip头的ttl, 用udp发送数据包, 然后用raw套接口接收icmp, 但是不管设置多长的raw套接口的接收超时时间, 始终没法收到预想的ttl超时, 或端口不可达的错误报文, 为什么?大致程序思路如下(ACE库):
//设置ttl
for (ttl = 1; ttl <= max_ttl && done == 0; ttl++) {
//mUdpSender是ACE的ACE_SOCK_Dgram类的实例
   mUdpSender_.set_option(IPPROTO_IP, IP_TTL, &ttl, sizeof(int))
   .....
//发送udp报文, 这里正常,如果不设ttl,我用另一个udp服务程序程序能接收到
mUdpSender_.send(udp_send_buff_, sizeof(udp_send_buff_), serveraddr));
......
//下面的类继承了ACE的ACE_ICMP_Socket, 有直接收发icmp报文的能力, 但是我试了一下, 收发ICMP_ECHO报文没问题,但是由上面的udp包引发的ttl超时的差错报文却怎么也收不到, 是不是windows下的机制和unix不一样?
this->recv(icmp_recv_buff_, sizeof(icmp_recv_buff_), 0, &timeout);求高人解答!