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;
}