文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 国产软件 | 国外软件 | 汉化补丁 | 设为首页 | 加入收藏
业界资讯 | 图形图像 | 操作系统 | 网络冲浪 | 工具软件 | 办公软件 | 媒体动画 | 精文荟萃 | 认证考试 | 网站建设 | 技术开发 | 专栏
当前位置:abcdown网络学院程序开发数据结构原始套接字透析之Raw Socket基础
精品广告
推荐TOP10
·网游外挂编写完全攻略
·开发WDM型的USB设备驱动程序
·数据库设计范式深入浅出
·理解软件保护技术之序列号方式
·大型网站必鉴:分销渠道的结构
·你的代码真的很健壮吗
·利用HOOK拦截封包原理
·四种网络游戏外挂的设计方法
·程序语言效率比较
·五子棋算法
阅读TOP10
·原始套接字透析之Raw Socket基础
·VS2005视频教程之站点导航慨述[视频]
·Windows中断编程
·DB2备份及恢复技术
·DB2数据库部分日常实用操作
·JDBC之代码重复使用
·深入理解Ruby语言中的String
·VS2005视频教程之站点地图[视频]
·VS2005视频教程之导航控件menu
·数据库设计范式深入浅出

原始套接字透析之Raw Socket基础

日期:2008年11月25日 作者: 查看:[大字体 中字体 小字体]


在进入Raw Socket多种强大的应用之前,我们先讲解怎样建立一个Raw Socket及怎样用建立的Raw Socket发送和接收IP包。

  建立Raw Socket

  在Windows平台上,为了使用Raw Socket,需先初始化WINSOCK:

// 启动 Winsock
WSAData wsaData;
if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0)
{
 cerr << "Failed to find Winsock 2.1 or better." << endl;
 return 1;
}
  MAKEWORD(2, 1)组成一个版本字段,2.1版,同样的,MAKEWORD(2, 2)意味着2.2版。MAKEWORD本身定义为:

inline word MakeWord(const byte wHigh, const byte wLow)
{
 return ((word)wHigh) << 8 wLow;
}
  因此MAKEWORD(2, 1)实际等同于0x0201。同样地,0x0101可等同于MAKEWORD(1, 1)。

  与WSAStartup()的函数为WSACleanup(),在所有的socket都使用完后调用,如:

void sock_cleanup()
{
 #ifdef WIN32
  sockcount--;
  if (sockcount == 0)
   WSACleanup();
 #endif
}
  接下来,定义一个Socket句柄:

SOCKET sd; // RAW Socket句柄
  创建Socket并将句柄赋值给定义的sd,可以使用WSASocket()函数来完成,其原型为:

SOCKET WSASocket(int af, int type, int protocol, LPWSAPROTOCOL_INFO
lpProtocolInfo, GROUP g, DWORD dwFlags);
  其中的参数定义为:

  af:地址家族,一般为AF_INET,指代IPv4(The Internet Protocol version 4)地址家族。

  type:套接字类型,如果创建原始套接字,应该使用SOCK_RAW;

  Protocol:协议类型,如IPPROTO_TCP、IPPROTO_UDP等;

  lpProtocolInfo :WSAPROTOCOL_INFO结构体指针;

  dwFlags:套接字属性标志。

  例如,下面的代码定义ICMP协议类型的原始套接字:

sd = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, 0, 0, 0);
  创建Socket也可以使用socket()函数:

SOCKET WSAAPI socket( int af, int type, int protocol);
  参数的定义与WSASocket()函数相同。

  为了使用socket()函数创建的Socket,还需要将这个Socket与sockaddr绑定:

SOCKADDR_IN addr_in;

addr_in.sin_family = AF_INET;
addr_in.sin_port = INADDR_ANY;
addr_in.sin_addr.S_un.S_addr = GetLocalIP();

nRetCode = bind(sd, (struct sockaddr*) &addr_in, sizeof(addr_in));
if (SOCKET_ERROR == nRetCode)
{
 printf("BIND Error!%d\n", WSAGetLastError());
}
  其中使用的struct sockaddr_in(即SOCKADDR_IN)为:

struct sockaddr_in
{
 unsigned short sin_family;
 unsigned short int sin_port;

[1] [2] [3] [4] [5] 下一页 

上一篇:黑客之旅――原始套接字透析之前言

下一篇:原始套接字透析之ICMP拒绝服务攻击


相关软件: 相关文章:
·激情聊天原来有陷阱!快来揭露视频MM的真面目
·原汁原味! 办公女郎天蓝坎肩配黑丝袜
·魔兽世界:法师装备选择指南(原则篇)
·如何建立一个网站?规划、设计、目的、原则、宣传
·QQ密码被盗之谜1:本地破解的奥秘原理和方法
·《拳皇97》简易出招原理解析
·AK47突击步枪的结构原理极其性能特点

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.abcdown.net
首页 | 本站声明 | 下载帮助 | 发布软件 |
中文版权所有:ABC学院 浙ICP备05000717号