中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 请教大虾,dos发icmp包时,SOKET用什么参数
作者:
标题: 请教大虾,dos发icmp包时,SOKET用什么参数 上一主题 | 下一主题
tobb133
新手上路





积分 18
发帖 9
注册 2008-9-16
状态 离线
『楼 主』:  请教大虾,dos发icmp包时,SOKET用什么参数

//dos下的ping.c
//网络是pctcp,开发工具borlandc 3.1
//问题是:1,dos发icmp包时,SOKET用什么参数,否则recvfrom不能接受到回复包
//问题是:2,谁有更好的方法,请和我联系,toter@163.com
//全部源码如下,请教高手。。。
/*所用的lib包
   sconfig.lib
   snetlib.lib
   spc.lib
   ssocket.lib
*/
  #include   <stdio.h>
  #include   <dos.h>
  #include   <stdlib.h>
  #include   <string.h>   
  #include   <time.h>
  #include   <netdb.h>  
  #include   <process.h>  
  #include   <arpa/inet.h>  
  #include   <sys/types.h>
  #include   <sys/socket.h>
  #include   <sys/types.h>   
  #include   <sys/ioctl.h>      
  #include   <netinet\in.h>

        typedef int INT;
        typedef unsigned int UINT;
        typedef unsigned long DWORD;
        typedef int BOOL;
        typedef unsigned char BYTE;
        typedef unsigned short WORD;
        typedef float FLOAT;
        typedef unsigned long ULONG;
        typedef unsigned short USHORT;
        typedef unsigned char UCHAR;
        typedef char *PSZ;
       
        #define PORT 1000    /* the port client will be connecting to */
        #define  ServerIP   "192.168.1.43"
        #define   ICMP_ECHO   8     
        #define MAX_PACKET       1024      // Max ICMP packet size

typedef struct _iphdr
{
    unsigned int   h_len:4;        // Length of the header
    unsigned int   version:4;      // Version of IP
    unsigned char  tos;            // Type of service
    unsigned short total_len;      // Total length of the packet
    unsigned short ident;          // Unique identifier
    unsigned short frag_and_flags; // Flags
    unsigned char  ttl;            // Time to live
    unsigned char  proto;          // Protocol (TCP, UDP etc)
    unsigned short checksum;       // IP checksum

    unsigned int   sourceIP;
    unsigned int   destIP;
} IpHeader;

typedef struct _icmphdr
{
    BYTE   i_type;
    BYTE   i_code;                 // Type sub code
    USHORT i_cksum;
    USHORT i_id;
    USHORT i_seq;
    // This is not the standard header, but we reserve space for time
    ULONG  timestamp;
} IcmpHeader;

//
// IP option header - use with socket option IP_OPTIONS
//
typedef struct _ipoptionhdr
{
    unsigned char        code;        // Option type
    unsigned char        len;         // Length of option hdr
    unsigned char        ptr;         // Offset into options
    unsigned long        addr[9];     // List of IP addrs
} IpOptionHeader;


void FillICMPData(char *icmp_data, int datasize)
{
   IcmpHeader *icmp_hdr = NULL;
    char       *datapart = NULL;

    icmp_hdr = (IcmpHeader*)icmp_data;
    icmp_hdr->i_type = ICMP_ECHO;        // Request an ICMP echo
    icmp_hdr->i_code = 0;
    icmp_hdr->i_id = (USHORT)getpid();
    icmp_hdr->i_cksum = 0;
    icmp_hdr->i_seq = 0;
  
    datapart = icmp_data + sizeof(IcmpHeader);
}
  //puclic   code   
  //网际校验和生产算法   
  //网际校验和是被校验数据16位值的反码和(ones-complement   sum)   
  unsigned   short   in_cksum(unsigned   short*   addr,   int   len)   
  {   
        int nleft   =   len;   
        int sum   =   0;   
        unsigned   short*   w   =   addr;   
        unsigned   short   answer   =   0;   
       
        while(nleft   >   1)   
        {   
        sum   +=   *w++;   
        nleft   -=   2;   
          }  
            if(nleft   ==   1)   
          {   
          *(unsigned   char*)(&answer)   =   *(unsigned   char*)w;   
          sum   +=   answer;   
          }   
            
          sum   =   (sum   >>   16)   +   (sum   &   0xffff);   
          sum   +=   (sum   >>   16);   
          answer   =   ~sum;   
          return   (answer);   
  }   
  
  main()
  {
        int   sockfd;
        int  iSendSize;
          struct   sockaddr_in   dest,from;   
        char   icmp_data[MAX_PACKET];
        int   datasize,ret,tmp;
        USHORT             seq_no ;

        int   fromlen;
        int   iRecvSize;
        IpOptionHeader   m_ipopt;
        char   recv_buffer[MAX_PACKET];
        long            last_time, now, timeout = 15L;
       
  if((sockfd=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP))<0)//这里不知道用在dos下用什么参数
  //if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)//dos下的upd通讯连接方式
  {
     printf("socket() failed\n");
     exit(1);
  }

  dest.sin_family =AF_INET;
  //server.sin_port   =htons( PORT );
  dest.sin_addr.s_addr = inet_addr(ServerIP);
  
    // Create the ICMP packet
datasize += sizeof(IcmpHeader);
memset(icmp_data,0,MAX_PACKET);
FillICMPData(icmp_data,datasize);
((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = (unsigned   long)time(NULL);
((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = in_cksum((unsigned   short*)icmp_data,   sizeof(IcmpHeader)   +   datasize);

  iSendSize=  sendto(sockfd, icmp_data,1024,0, (struct sockaddr*)&dest, sizeof(dest)) ;
  if (iSendSize< 0 )
  {
          printf("icmp sendto 192.168.1.43 failed\n");
          close(sockfd);
          exit(2);                                 
  }
   printf("发送的数据 %d \n",iSendSize);
   fprintf(stdout,   "Reply...\r\n");   
  
  
       
  memset(&from,   0,   sizeof   from);   
  memset(recv_buffer,   0,   1024);  
  fromlen   =   sizeof(from);   
  iRecvSize   =   recvfrom(sockfd,   recv_buffer,   1024,   0,   (struct   sockaddr*)&from,     &fromlen);   
  if   (iRecvSize   >   0){   
          printf("recvfrom 192.168.1.43 success\n");
  }else
  {   
          printf("recvfrom 192.168.1.43 failed\n");
  }       
          


    close(sockfd);
    return 1;
  }

2008-12-18 17:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: