CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

关于ICMP数据接收问题

楼主qitengyi(齐藤一)2003-07-04 00:59:09 在 VC/MFC / 网络编程 提问

本人用RAW   SOCKET编写的TRACERT程序,创建一个UDP原始SOCKET,发送一个UDP数据报,并且端口设置很大,以产生一个ICMP端口不可达差错报文,然后在创建一个ICMP原始SOCKET接受这个差错报文,但是总也接收不到,我用WSAGetLastError()函数扑获错误,错误代码是10022,不知道哪里出错了,我的接收代码是按PING程序的接收写的原码如下:  
              int   main(int   argc,   char*   argv[])  
            {  
              CreateWSASocket();  
             
            }  
              BOOL       WINAPI       CreateWSASocket()  
            {  
                ......  
                //发送UDP数据报,并且发送成功!  
            }  
            //接收ICMP差错抱文  
            BOOL     WINAPI     RecvData()  
            {  
              //ICMP_HDR           icmphdr;  
              //IP_HDR               iphdr;  
                  SOCKADDR_IN     RemoteAddr;  
                  INT                     byte               =     NULL,  
                                            TimeOut         =     2000,  
                                            ErrCode         =     NULL,  
                                            USize             =     NULL,    
                                            TotalSize     =     NULL;    
                  SOCKET               ICMPSocket   =     NULL;  
                  CHAR                   RecvData[MAX_LENGTH];  
                  if(!InitWinSock())  
    return   FALSE;  
                  ICMPSocket=WSASocket(AF_INET,    
                                                            SOCK_RAW,  
                                                            IPPROTO_ICMP,  
                                                            NULL,  
                                                            0,  
                                                            WSA_FLAG_OVERLAPPED);      
      if(ICMPSocket   ==   INVALID_SOCKET)  
      {  
          printf("WSASocket   failed!\n");  
          closesocket(ICMPSocket);  
          GetErrorCode();  
      }  
  //     else  
  //         printf("WSASocket   success!\n");  
   
      ErrCode   =     setsockopt(ICMPSocket,SOL_SOCKET,SO_RCVTIMEO,(CHAR*)   &TimeOut,sizeof(TimeOut));  
      if(ErrCode   ==   SOCKET_ERROR)  
      {  
          printf("setsockopt   failed!\n");  
          closesocket(ICMPSocket);  
          GetErrorCode();  
      }  
      else  
          printf("setsockopt   success!\n");      
       
       
      USize   =   sizeof(RemoteAddr);  
      ZeroMemory(RecvData,sizeof(RecvData));  
      byte   =   recvfrom(ICMPSocket,RecvData,sizeof(RecvData),0,(LPSOCKADDR)&RemoteAddr,&USize);  
      if(byte   ==   SOCKET_ERROR)  
      {  
        closesocket(ICMPSocket);  
        printf("recvfrom   failed:%d\n"   ,   WSAGetLastError());  
        if(WSAGetLastError()   ==   WSAEINVAL)  
        {  
          printf("WSAEINVAL\n");      
          GetErrorCode();  
        }  
      }  
      else  
        printf("recvfrom   byte   =   %d\n"   ,   byte);        
  return   TRUE;  
  }  
  请高手指教哪里出错了,并且正确的接收应该如何编写 问题点数:0、回复次数:2Top

1 楼c0der()回复于 2003-07-04 10:09:44 得分 0

开什么玩笑?发送ICMP   报文用UDP?有没有搞错.你连概念都没有搞清楚。  
  ICMP是网络层(IP层)的,UDP是传输层的。用UDP   socket怎么能发送ICMP报文那?  
   
  不好意思,没有看代码。Top

2 楼c0der()回复于 2003-07-04 10:13:04 得分 0

给你一个例子吧:  
  http://www.vccode.com/file_show.php?id=1368Top

相关问题

  • MSCOMM 接收数据问题
  • servlet接收xml数据流
  • WinSocket接收数据问题!
  • 关键字:winsock 数据接收 接收类型
  • 用TWinSocketStream接收不到数据
  • 串口接收数据的问题?
  • 串口接收数据如何处理?
  • SOCKET编程,接收数据不完整?
  • socket客户端接收数据问题
  • 组播数据接收问题

关键词

  • 数据
  • 代码
  • socket
  • null
  • icmpsocket
  • recvdata
  • 报文
  • icmp
  • usize
  • remoteaddr

得分解答快速导航

  • 帖主:qitengyi

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo