我写了一个抓包,改造后发包的程序,发包时发不出去,返回SOCKET_ERROR
不知道怎么调试,哪位牛人帮我调一下,加我msn    [email protected] 或QQ 87969336

解决方案 »

  1.   

    好玩.发给我
    [email protected]
      

  2.   

    发一份给我学习.
    [email protected]
      

  3.   

    给我一个看看吧
    MSN: [email protected]
      

  4.   

    GetLastError() 
    看一下具体的错误信息.
      

  5.   

    GetLastError() 
    看一下具体的错误信息.
    这个不会我是菜鸟,那个程序也是照着写的
      

  6.   

    DWORD retError = GetLastError(void);把retError的值填入vc的菜单tool中的error lookup工具中,可以得到具体的错误原因。
      

  7.   

    截获在LINUX下用PCAP包,在windows下可以直接得到。
    发送很简单,定义原始套接字发送,定义一个BUF,按TCP或UDP的包结构把数据填进去,然后发送。
      

  8.   

    IPHEADER ip_header;
    TCPPacketHead tcp_header;
    PSD_HEADER psd_header;
    char SendBuf[100]={0};
    sockaddr_in dest;
    memset(&dest,0,sizeof(dest)); 
    dest.sin_family = AF_INET; 
    dest.sin_port = pTCPHead->SourPort; 
    dest.sin_addr.s_addr=pIpHeader->sourceIP;
    //填充IP首部 
    ip_header.version=4; 
    ip_header.header_len=sizeof(ip_header)/sizeof(unsigned long);
    //高四位IP版本号,低四位首部长度 
    ip_header.total_len=htons(sizeof(ip_header)+sizeof(tcp_header)); //16位总长度(字节) 
    ip_header.ident=1; //16位标识 
    ip_header.flags=0; //3位标志位 
    ip_header.ttl=128; //8位生存时间TTL 
    ip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…) 
    ip_header.checksum=0; //16位IP首部校验和 
    ip_header.sourceIP=pIpHeader->destIP; //32位源IP地址 
    ip_header.destIP=pIpHeader->sourceIP; //32位目的IP地址 //填充TCP首部 
    tcp_header.SourPort=pTCPHead->DestPort; //源端口号 
    tcp_header.DestPort=pTCPHead->SourPort; //目的端口号 
    tcp_header.SeqNo=pTCPHead->AckNo; //SYN序列号 
    tcp_header.AckNo=htonl(ntohl(pTCPHead->SeqNo)+1); //ACK序列号置为0 
    tcp_header.HLen=(sizeof(TCPPacketHead)/4<<4|0); //TCP长度和保留位 
    tcp_header.Flag=4; //RST 标志 
    tcp_header.WndSize=htons(16384); //窗口大小 
    tcp_header.UrgPtr=0; //偏移 
    tcp_header.ChkSum=0; //校验和 
    //填充TCP伪首部(用于计算校验和,并不真正发送) 
    psd_header.saddr=ip_header.sourceIP; 
    psd_header.daddr=ip_header.destIP; 
    psd_header.mbz=0; 
    psd_header.ptcl=IPPROTO_TCP; 
    psd_header.tcpl=htons(sizeof(tcp_header)); 
    //计算TCP校验和,计算校验和时需要包括TCP pseudo header  
    memcpy(SendBuf,&psd_header,sizeof(psd_header));  
    memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); 
    tcp_header.ChkSum=CIpmonDlg:: checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)); 
    //计算IP校验和 
    memcpy(SendBuf,&ip_header,sizeof(ip_header)); 
    memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); 
    memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4); 
     
    ip_header.checksum=CIpmonDlg::checksum((USHORT *)SendBuf,sizeof(ip_header)+sizeof(tcp_header)); //填充发送缓冲区 
    memcpy(SendBuf,&ip_header,sizeof(ip_header)); //发送TCP报文 
    int bbb=sendto(pDlg->m_s,SendBuf,sizeof(ip_header)+sizeof(tcp_header),0,(struct sockaddr*) &dest, sizeof(dest));
    if(bbb=SOCKET_ERROR) 
    {AfxMessageBox("1aaaa111");}
    //delete []SendBuf;
      

  9.   

    上面是我加的东西,
    DWORD retError = GetLastError(void);放在哪里?
      

  10.   

    to回复人: dawndu(东南飞) 
    我是传说中术士:)