#include <stdio.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> #define SOURCE_PORT 7234 
#define MAX_RECEIVEBYTE 255 typedef struct ip_hdr //定义IP首部 

unsigned char h_verlen; //4位首部长度,4位IP版本号 
unsigned char tos; //8位服务类型TOS 
unsigned short total_len; //16位总长度(字节) 
unsigned short ident; //16位标识 
unsigned short frag_and_flags; //3位标志位 
unsigned char ttl; //8位生存时间 TTL 
unsigned char proto; //8位协议 (TCP, UDP 或其他) 
unsigned short checksum; //16位IP首部校验和 
unsigned int sourceIP; //32位源IP地址 
unsigned int destIP; //32位目的IP地址 
}IPHEADER; typedef struct tsd_hdr //定义TCP伪首部 

unsigned long saddr; //源地址 
unsigned long daddr; //目的地址 
char mbz; 
char ptcl; //协议类型 
unsigned short tcpl; //TCP长度 
}PSDHEADER; typedef struct tcp_hdr //定义TCP首部 

USHORT th_sport; //16位源端口 
USHORT th_dport; //16位目的端口 
unsigned int th_seq; //32位序列号 
unsigned int th_ack; //32位确认号 
unsigned char th_lenres; //4位首部长度/6位保留字 
unsigned char th_flag; //6位标志位 
USHORT th_win; //16位窗口大小 
USHORT th_sum; //16位校验和 
USHORT th_urp; //16位紧急数据偏移量 
}TCPHEADER; //CheckSum:计算校验和的子函数 
USHORT checksum(USHORT *buffer, int size) 

unsigned long cksum=0; 
while(size >1) 

cksum+=*buffer++; 
size -=sizeof(USHORT); 

if(size ) 

cksum += *(UCHAR*)buffer; 
} cksum = (cksum >> 16) + (cksum & 0xffff); 
cksum += (cksum >>16); 
return (USHORT)(~cksum); 
} void useage() 

printf("******************************************\n"); 
printf("TCPPing\n"); 
printf("\t Written by Refdom\n"); 
printf("\t Email: [email protected]\n"); 
printf("Useage: TCPPing.exe Target_ip Target_port \n"); 
printf("*******************************************\n"); 
} int main(int argc, char* argv[]) 

WSADATA WSAData; 
SOCKET sock; 
SOCKADDR_IN addr_in; 
IPHEADER ipHeader; 
TCPHEADER tcpHeader; 
PSDHEADER psdHeader; char szSendBuf[60]={0}; 
BOOL flag; 
int rect,nTimeOver; useage(); if (argc!= 3) 
{ return false; } if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) 

printf("WSAStartup Error!\n"); 
return false; 
} if 
((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP
PED))==INVALID_SOCKET) 

printf("Socket Setup Error!\n"); 
return false; 

flag=true; 
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char 
*)&flag,sizeof(flag))==SOCKET_ERROR) 

printf("setsockopt IP_HDRINCL error!\n"); 
return false; 
} nTimeOver=1000; 
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, 
sizeof(nTimeOver))==SOCKET_ERROR) 

printf("setsockopt SO_SNDTIMEO error!\n"); 
return false; 

addr_in.sin_family=AF_INET; 
addr_in.sin_port=htons(atoi(argv[2])); 
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]); // 
// 
//填充IP首部 
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); 
// ipHeader.tos=0; 
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)); 
ipHeader.ident=1; 
ipHeader.frag_and_flags=0; 
ipHeader.ttl=128; 
ipHeader.proto=IPPROTO_TCP; 
ipHeader.checksum=0; 
ipHeader.sourceIP=inet_addr("本地地址"); 
ipHeader.destIP=inet_addr(argv[1]); //填充TCP首部 
tcpHeader.th_dport=htons(atoi(argv[2])); 
tcpHeader.th_sport=htons(SOURCE_PORT); //源端口号 
tcpHeader.th_seq=htonl(0x12345678); 
tcpHeader.th_ack=0; 
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0); 
tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK
探测 等等 
tcpHeader.th_win=htons(512); 
tcpHeader.th_urp=0; 
tcpHeader.th_sum=0; psdHeader.saddr=ipHeader.sourceIP; 
psdHeader.daddr=ipHeader.destIP; 
psdHeader.mbz=0; 
psdHeader.ptcl=IPPROTO_TCP; 
psdHeader.tcpl=htons(sizeof(tcpHeader)); //计算校验和 
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); 
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); 
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4); 
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader), 
0, (struct sockaddr*)&addr_in, sizeof(addr_in)); 
if (rect==SOCKET_ERROR) 

printf("send error!:%d\n",WSAGetLastError()); 
return false; 

else 
printf("send ok!\n"); closesocket(sock); 
WSACleanup(); return 0; 
}先谢谢高手了!!!

解决方案 »

  1.   

    这么长!!!
    而且生硬的翻译也不行呀!是不是个数据包分析的东东?
    我有一个delphi的,你要吗?
      

  2.   

    myling(阿德) :
      你可以发给我一个看看,对这个有没有用
    [email protected]
      

  3.   

    写ping程序?有很多现成的了,down就是,自己改不是办法
      

  4.   

    ljmanage(过客) :
        你好我是新来的(学生来的,没经验,上来学习的!)
    "up一下算了"是什么意思啊?
      

  5.   

    要是楼主的问题还是没有解决,干脆自己研究C++和Delphi(OP),然后写一个CPP2OP转换/翻译器程序好了。
      

  6.   

    这段代码,好象不是用于 Windows 平台的,它用的 IO 头文件是 stdio.h,而不是 windows.h,并且多个地方用了printf语句,如果不是用于控制台程序,一定会出现运行错误。
    建议去网上找找,应该有很多现成的用 Delphi 制作的窗口界面的 Ping 代码。很多书里也能找到。
      

  7.   

    昏~怎么不是Windows平台阿
    看这就看得出来“#include <winsock2.h>”
      

  8.   

    C header文件,找个软件转换一下试试。
    好像Dr. Bob写过一个。
    上网找一找。
      

  9.   

    uses
      windows,
      sysutils,
      winsock,
      winsock2;const SOURCE_PORT=7234 ;
        MAX_RECEIVEBYTE=255 ;type 
    TIPHEADER=packed record //定义IP首部
       h_verlen:byte; //4位首部长度,4位IP版本号
            tos:byte; //8位服务类型TOS
       total_len:word; //16位总长度(字节)
       ident:word; //16位标识
       frag_and_flags:word; //3位标志位
       ttl:byte; //8位生存时间 TTL
       proto:byte; //8位协议 (TCP, UDP 或其他)
       checksum:word; //16位IP首部校验和
       sourceIP:Dword; //32位源IP地址
       destIP:dword; //32位目的IP地址
    end;
      //R;TPSDHEADER=record //定义TCP伪首部
      saddr:dword; //源地址
      daddr:dword; //目的地址
        mbz:byte;
       ptcl:byte; //协议类型
       tcpl:word; //TCP长度
    end;
    //;TTCPHEADER=record //定义TCP首部   th_sport:word; //16位源端口
       th_dport:word; //16位目的端口
       th_seq:Dword; //32位序列号
       th_ack:Dword; //32位确认号
       th_lenres:byte; //4位首部长度/6位保留字
       th_flag:byte; //6位标志位
       th_win:word; //16位窗口大小
       th_sum:word; //16位校验和
       th_urp:word; //16位紧急数据偏移量 
    end;
    //CheckSum:计算校验和的子函数 function checksum(buffer:pword; size:integer):word ;
    var  cksum:Dword;
    Begin 
      cksum:=0;
      while(size >1) do
      Begin 
       cksum:=cksum+buffer^;
       inc(buffer); 
       size:=size-sizeof(word); 
      End; 
      if(size>0 ) then 
        cksum:=cksum+ord(pchar(buffer)[0]); 
      cksum := cksum shr 16 + (cksum and $ffff); 
      cksum:=cksum+(cksum shr 16); 
      result:=word(not cksum); 
    End; procedure useage() ;
    Begin 
      writeln('******************************************');
      writeln('TCPPing');
      writeln(#9'Written by Refdom');
      writeln(#9'Email: [email protected]');
      writeln('Useage: TCPPing.exe Target_ip Target_port ');
      writeln('*******************************************');
    End;
    var
        WSAData:TWSADATA;
        sock:TSocket;
        addr_in:SOCKADDR_IN ;
        ipHeader: TIPHEADER;
        tcpHeader:TTCPHEADER;
        psdHeader:TPSDHEADER;    szSendBuf:array[0..59] of char;
        flag:Bool;
        rect,nTimeOver:integer;
        tail:pchar;
    Begin    fillchar(szSendBuf,sizeof(szSendBuf),0);
        useage();
        if ( paramcount<> 2) then
           exit;
        if WSAStartup(MAKEWORD(2,2),WSAData)<>0 then
        Begin
          writeln('WSAStartup Error!');
          exit;
        End;
        sock:=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,nil,0,WSA_FLAG_OVERLAPPED);    if  sock=INVALID_SOCKET then
        Begin
          writeln('Socket Setup Error!');
          exit;
        End;
        flag:=true;
        if setsockopt(sock,IPPROTO_IP, IP_HDRINCL,pchar(@flag),sizeof(flag))=SOCKET_ERROR then
        Begin
          writeln('setsockopt IP_HDRINCL error!');
          exit;
        End;
        nTimeOver:=1000;
        if setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, pchar(@nTimeOver),sizeof(nTimeOver))=SOCKET_ERROR then
        Begin
          writeln('setsockopt SO_SNDTIMEO error!');
          exit;
        End;
        addr_in.sin_family:=AF_INET;
        addr_in.sin_port:=htons(strtoint(paramstr(2)));
        addr_in.sin_addr.S_addr:=inet_addr(pchar(paramstr(1)));    //
        //
        //填充IP首部
        ipHeader.h_verlen:=integer(4 shl 4) or  integer(sizeof(ipHeader) div sizeof(dword));
        // ipHeader.tos=0;
        ipHeader.total_len:=htons(sizeof(ipHeader)+sizeof(tcpHeader));
        ipHeader.ident:=1;
        ipHeader.frag_and_flags:=0;
        ipHeader.ttl:=128;
        ipHeader.proto:=IPPROTO_TCP;
        ipHeader.checksum:=0;
        ipHeader.sourceIP:=inet_addr('192.168.2.10');
        ipHeader.destIP:=inet_addr(pchar(paramstr(1)));    //填充TCP首部
        tcpHeader.th_dport:=htons(strtoint(paramstr(2)));
        tcpHeader.th_sport:=htons(SOURCE_PORT); //源端口号
        tcpHeader.th_seq:=htonl($12345678);
        tcpHeader.th_ack:=0;
        tcpHeader.th_lenres:=(sizeof(tcpHeader)div 4) shl 4;
        tcpHeader.th_flag:=2;
        tcpHeader.th_win:=htons(512);
        tcpHeader.th_urp:=0;
        tcpHeader.th_sum:=0;    psdHeader.saddr:=ipHeader.sourceIP;
        psdHeader.daddr:=ipHeader.destIP;
        psdHeader.mbz:=0;
        psdHeader.ptcl:=IPPROTO_TCP;
        psdHeader.tcpl:=htons(sizeof(tcpHeader));    //计算校验和
        move(szSendBuf, psdHeader, sizeof(psdHeader));
        move((pchar(@szSendBuf)+sizeof(psdHeader))^, tcpHeader, sizeof(tcpHeader));
        tcpHeader.th_sum:=checksum(@szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
        move(szSendBuf, ipHeader, sizeof(ipHeader));
        move((pchar(@szSendBuf)+sizeof(ipHeader))^, tcpHeader, sizeof(tcpHeader));
        tail:= pchar(@szSendBuf)+sizeof(ipHeader)+sizeof(tcpHeader);
        fillchar(tail[0],4, 0);
        ipHeader.checksum:=checksum(@szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
        move(szSendBuf, ipHeader, sizeof(ipHeader));
        rect:=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader), 0, addr_in, sizeof(addr_in));
        if (rect=SOCKET_ERROR) then
        Begin
          writeln('send error!:',WSAGetLastError());
          exit;
        End else
          writeln('send ok!');
        closesocket(sock);
        WSACleanup();
    End.