原始套接字類

記一下,這個程序主要的幾個步驟:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章