请各位 帮忙看一下 为什么我的sendto 总是返回-1 各参数值都是对的啊.nRect= sendto( sock, szSendBuf, sizeof(tag_ipHeader) + sizeof(tag_tcpHeader), 0, (struct sockaddr*)&tag_add_in, sizeof(tag_add_in) );

解决方案 »

  1.   

    WSAGetLastError()返回的是10004 
      

  2.   

    我使用的是ICMP协议 发送的错误数据包  自己填写的伪IP头 送局域网内的所有在线主机发送  
    tag_add_in.sin_family = AF_INET;
    tag_add_in.sin_port = htons(1024); //端口号
    tag_add_in.sin_addr.S_un.S_addr = inet_addr("192.168.138.161"); //IP地址 //填充IP首部
    tag_ipHeader.h_verlen = ( 4 << 4 | sizeof(tag_ipHeader) / sizeof(unsigned long) );
    tag_ipHeader.total_len = htons( sizeof(tag_ipHeader) + sizeof(tag_tcpHeader) );
    tag_ipHeader.ident = 1;
    tag_ipHeader.frag_and_flags = 0;
    tag_ipHeader.ttl = 128;
    tag_ipHeader.proto = IPPROTO_TCP;
    tag_ipHeader.checksum = 0;
    tag_ipHeader.sourceIP = inet_addr("192.168.138.160"); //本地IP地址
    tag_ipHeader.destIP = inet_addr("192.168.138.161"); //填充TCP首部
    tag_tcpHeader.th_dport = htons(1024);
    tag_tcpHeader.th_sport = htons( SOURCE_PORT ); //源端口号
    tag_tcpHeader.th_seq = htonl( 0x12345678 );
    tag_tcpHeader.th_ack = 0;
    tag_tcpHeader.th_lenres = ( sizeof(tag_tcpHeader) / 4 << 4 | 0 );
    tag_tcpHeader.th_flag = 2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测等等
    tag_tcpHeader.th_win = htons( 512 );
    tag_tcpHeader.th_urp = 0;
    tag_tcpHeader.th_sum = 0; tag_psdHeader.saddr = tag_ipHeader.sourceIP;
    tag_psdHeader.daddr = tag_ipHeader.destIP;
    tag_psdHeader.mbz = 0;
    tag_psdHeader.ptcl = IPPROTO_TCP;
    tag_psdHeader.tcpl = htons( sizeof(tag_tcpHeader) );
      

  3.   

    Socket  错误号10004的意思是:程序拒绝操作,操作被中止
    你的Socket连接成功建立了么
      

  4.   

    if ( WSAStartup( MAKEWORD(2,2), &wsaData) != 0 )
    {
    AfxMessageBox("WSAStartup Error!");
    }

    if (( sock = WSASocket( AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED )) == INVALID_SOCKET)
    {
    AfxMessageBox("Socket Setup Error!");
    } if ( setsockopt( sock, IPPROTO_IP, IP_HDRINCL, (char*) & bflag, sizeof( bflag )) == SOCKET_ERROR )
    {
    AfxMessageBox("setsockopt IP_HDRINCL error!");
    } nTimeOver = 1000; if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*) & nTimeOver, sizeof(nTimeOver)) == SOCKET_ERROR)
    {
    AfxMessageBox("setsockopt SO_SNDTIMEO error!");
    } tag_add_in.sin_family = AF_INET;
    tag_add_in.sin_port = htons(1024); //端口号
    tag_add_in.sin_addr.S_un.S_addr = inet_addr("192.168.138.161"); //IP地址 //填充IP首部
    tag_ipHeader.h_verlen = ( 4 << 4 | sizeof(tag_ipHeader) / sizeof(unsigned long) );
    tag_ipHeader.total_len = htons( sizeof(tag_ipHeader) + sizeof(tag_tcpHeader) );
    tag_ipHeader.ident = 1;
    tag_ipHeader.frag_and_flags = 0;
    tag_ipHeader.ttl = 128;
    tag_ipHeader.proto = IPPROTO_TCP;
    tag_ipHeader.checksum = 0;
    tag_ipHeader.sourceIP = inet_addr("192.168.138.160"); //本地IP地址
    tag_ipHeader.destIP = inet_addr("192.168.138.161"); //填充TCP首部
    tag_tcpHeader.th_dport = htons(1024);
    tag_tcpHeader.th_sport = htons( SOURCE_PORT ); //源端口号
    tag_tcpHeader.th_seq = htonl( 0x12345678 );
    tag_tcpHeader.th_ack = 0;
    tag_tcpHeader.th_lenres = ( sizeof(tag_tcpHeader) / 4 << 4 | 0 );
    tag_tcpHeader.th_flag = 2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测等等
    tag_tcpHeader.th_win = htons( 512 );
    tag_tcpHeader.th_urp = 0;
    tag_tcpHeader.th_sum = 0; tag_psdHeader.saddr = tag_ipHeader.sourceIP;
    tag_psdHeader.daddr = tag_ipHeader.destIP;
    tag_psdHeader.mbz = 0;
    tag_psdHeader.ptcl = IPPROTO_TCP;
    tag_psdHeader.tcpl = htons( sizeof(tag_tcpHeader) ); //计算效验和
    memcpy( szSendBuf, &tag_psdHeader, sizeof(tag_psdHeader) );
    memcpy( szSendBuf + sizeof(tag_psdHeader), &tag_tcpHeader, sizeof(tag_tcpHeader) );
    tag_tcpHeader.th_sum = Scan_CheckSum( (USHORT*)szSendBuf, sizeof(tag_psdHeader) + sizeof(tag_tcpHeader) ); memcpy( szSendBuf, &tag_ipHeader, sizeof(tag_ipHeader) );
    memcpy( szSendBuf + sizeof(tag_ipHeader), &tag_tcpHeader, sizeof(tag_tcpHeader) );
    memset( szSendBuf + sizeof(tag_ipHeader) + sizeof(tag_tcpHeader), 0, 4 );
    tag_ipHeader.checksum = Scan_CheckSum( (USHORT*)szSendBuf, sizeof(tag_ipHeader) + sizeof(tag_tcpHeader) );
    memcpy( szSendBuf, &tag_ipHeader, sizeof(tag_ipHeader) );
    nRect = sendto( sock, szSendBuf, sizeof(tag_ipHeader) + sizeof(tag_tcpHeader), 0, (struct sockaddr*)&tag_add_in, sizeof(tag_add_in) );

    if ( nRect == SOCKET_ERROR )
    {
    AfxMessageBox("Send Error!");
    } 请求各位大大帮忙看看 是否有错