//源码先:[C,不是C++,调试编译时请用C的方式]
//环境:winxp_sp2+VS2003
#include  <winsock2.h>
#include  <ws2tcpip.h>
#pragma  comment(lib,"ws2_32.lib")void  main(void)
{
    struct  WSAData  wsaData;
    //这是一个从 192.168.10.110:1026 -> 192.168.10.250:80 建立TCP连接3次握手的第一个SYN包,用抓包工具抓得,未作任何修改,直接将其内容copy到这个数组中
    unsigned  short  sendPkg[26]={0x4500,0x0034,0x0008,0x4000,0x4006,0xA403,0xC0A8,0x0A6E,0xC0A8,0x0AFA,0x0402,0x0050,0x7424,0x6E47,0x0000,0x0000,0x8002,0xFFFF,0xF1A7,0x0000,0x0204,0x05AC,0x0103,0x0302,0x0101,0x0402};
    SOCKET  s;
    DWORD  ipHead=1;  //自己设置IP头
    struct  sockaddr_in  to;  //发送目标
long tmp=0;
    to.sin_family=AF_INET;
    to.sin_port=htons(80);
    to.sin_addr.S_un.S_addr=inet_addr("192.168.10.250");
for(tmp=0; tmp<8; tmp++) to.sin_zero[tmp]=0;    WSAStartup(0x0202,&wsaData);
    //使用原始socket和原始协议
    s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
    //设置自己填充IP头
    setsockopt(s,IPPROTO_IP,IP_HDRINCL,  &ipHead,  sizeof(ipHead));
    //下面显示"0",表示尚未发生错误
    printf("%u,",WSAGetLastError());
    sendto(s,sendPkg,26*2,0,&to,sizeof(to));//发送数据包
    printf("%u",WSAGetLastError());
//这里显示"10004"错误,MSDN的解释是:
//Interrupted  function  call.
//A  blocking  operation  was  interrupted  by  a  call  to  WSACancelBlockingCall.
//可是我重启后以管理员身份重新运行它也仍然出现这个错误,郁闷ing....不知道问题出在哪里
    getchar();//暂停一下
}