原始套接字类

记一下,这个程序主要的几个步骤:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本支持库在Win9x/ME/NT/2000/XP环境下实现了对WinSock2的函数拦截(包括如下函数:socket/closesocket/bind/listen/connect/accept/send/sendto/recv/recvfrom)。系统中任何程序使用WinSock2的函数都会被本支持库所拦截,并使用易语言事件触发的方式处理,您可以在被触发的事件中按照相应事件的规则自由的处理其他程序的WinSock调用。如果您对WinSock或Windows网络编程不是很了解,建议您在使用本支持库前阅读WinSock等其他相关文档或教程。注意:在使用本支持库前,您必须先正确安装网络服务提供者(ESPINN.dll(NN为当前版本))文件。网络服务提供者(ESPINN.dll(NN为当前版本))文件必须是随本支持库一起附带的网络服务提供者(ESPINN.dll(NN为当前版本)),否则安装将失败。当前本支持库对应的网络服务提供者版本是1.1。安装方法:使用"网络服务安装"中的"安装"命令(注意该命令的参数一定要填写正确)。卸载方法:首先您必须确定系统中和本支持库似的拦截/过滤软件已正确卸载或没有卸载,否则请千万不要使用卸载方法!使用"网络服务安装"中的"卸载"命令,如果本方法没有执行成功,请千万不要删除已成功安装到系统路径下的网络服务提供者(ESPINN.dll(NN为当前版本))文件,原因请见下列警告。 [ 警告 ]如果网络服务提供者(ESPINN.dll(NN为当前版本))已经安装成功,并且"卸载"命令没有成功执行,(注意:只有"卸载"命令返回"真"才代表真正成功卸载了),或根本没有使用"卸载"命令,系统路径下的网络服务提供者(ESPINN.dll(NN为当前版本))文件不可以改名、删除或移动路径,否则很有可能导致整个系统的WinSock瘫痪。如果上述情况真的发生了也不要紧,您可以将随本支持库附带的网络服务提供者(ESPINN.dll(NN为当前版本))文件再次复制到系统路径中(推荐使用此方法,因为后面的方法在某些特定情况下可能不保险),或者直接执行"卸载"命令,并确定该命令是执行成功了。 操作系统支持: Windows
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值