Raw Socket

    技术2022-05-11  46

    int _tmain(int argc, _TCHAR*  argv[])    {    try         {    WSADATA wsaData;    WSAStartup(MAKEWORD( 2,2),& wsaData);    SOCKET s;    s= socket(AF_INET,SOCK_RAW,IPPROTO_IP);    char name[256 ];    gethostname(name,sizeof (name));    hostent* host= gethostbyname(name);    sockaddr_in localAddr;    memset(&localAddr,0,sizeof (localAddr));    localAddr.sin_family= AF_INET;    localAddr.sin_port=0 ;    localAddr.sin_addr=*(in_addr*)host->h_addr_list[0 ];    if(SOCKET_ERROR==::bind(s,(sockaddr*)&localAddr,sizeof (localAddr)))        {        throwLastError();        }    DWORD returned=true ;    if(SOCKET_ERROR==ioctlsocket(s,SIO_RCVALL,& returned))        {        throwLastError();        }    bool flag = true ;    setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char*&flag, sizeof (flag));    char buf[65536 ];    ProcessPacket pp;    thread_group tg;    tg.create_thread(boost::bind(&ProcessPacket::process,& pp));    tg.create_thread(boost::bind(&ProcessPacket::process,& pp));    tg.create_thread(boost::bind(&ProcessPacket::processReady,& pp));    tg.create_thread(boost::bind(&ProcessPacket::process,& pp));    tg.create_thread(boost::bind(&ProcessPacket::process,& pp));    while(true )        {        int rt=0 ;        rt=recv(s,buf,sizeof(buf),0 );        if(SOCKET_ERROR== rt)            {            cout<<getLastError()<< endl;            continue ;            }        Packet packet;        packet.assign(buf);        pp.pushQueue(packet);        }    closesocket(s);    WSACleanup();        }    catch(exception&  e)        {        cout<<e.what()<< endl;        }    return 0 ;    }  

    最新回复(0)