記一下,這個程序主要的幾個步驟:
1、初始化Winsock2.dll文件
BOOL CSniff::IniNetDll()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
AfxMessageBox("Load WinSock DLL failed!");
return FALSE;
}
return TRUE;
}
2、接到本地的IP地址:
BOOL CSniff::GetLocalHostInfo()
{
CHAR szHostName[128] = {0};
HOSTENT* pHost = NULL;
CHAR* pszIp = NULL;
int iNum = 0;
if(gethostname(szHostName, 128)==0)
{
pHost = gethostbyname(szHostName);
if(pHost != NULL)
{
pszIp = inet_ntoa(*(in_addr*)pHost->h_addr_list[iNum]);
m_ipsource = inet_addr(pszIp);
}
else
{
AfxMessageBox("pHost = NULL!");
return FALSE;
}
}
return TRUE;
}
3、創建一個原始套接字
ss = new SOCKET;
*ss = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;
if( INVALID_SOCKET == *ss )
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error socket() = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
closesocket( *ss ) ;
return ;
}
4、設置原始套接字參數
int rcvtimeo = 5000 ; // 5 sec insteadof 45 as default
if( setsockopt( *ss , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
closesocket( *ss ) ;
return ;
}
5、邦定
sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
sa.sin_addr.s_addr= m_iphostsource;
if (bind(*ss,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error bind() = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
closesocket( *ss ) ;
return ;
}
6、設置
if( SOCKET_ERROR != WSAIoctl( *ss, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),
&dwBufferLen, sizeof(dwBufferLen),
&dwBytesReturned , NULL , NULL ) )
{
TRACE("成功/n");
}
else
{
TRACE("失敗/n");
}
7、開始接收
char buff[5102];
ZeroMemory(buff,5102);
int nRet = recv(*ss,buff,5102,0);
if(nRet == SOCKET_ERROR)
{
TRACE("接收失敗!%d/n", WSAGetLastError());
}