第十章 原始套接口 ----------------------第一节 创建原始套接口

  使用原始套接口的第一步是创建套接口。你可以使用socket或用WSASocket来创建。注意对于Windows 95, Windows 98, and Windows Me来说,在Winsock里没有目录条目的IP有SOCK_RAW套接口类型,可是,这不能防碍你创建这种套接口。它的意思是你不通过使用一个WSAPROTOCOL_INFO结构来创建一个原始套接口。返回第二章中查阅关于通过使用函数WSAEnumProtocols和WSAPROTOCOL_INFO结构体列举协议条目的消息。你必须自己在套接口创建中指定SOCK_RAW标记。下面的代码片段展示了在IP协议下使用ICMP创建一个原始的套接口。
SOCKET    s;
s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
// Or
s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,
    WSA_FLAG_OVERLAPPED);
if (s == INVALID_SOCKET)
{
    // 套接口创建失败
}
当创建一个原始套接口时,被调用的套接口协议参数在IP头里变成了协议值。如果一个原始AF_INET6套接口用协议值66创建,那么IPv6对于输出包会包含66在下一个头域里。

  因为原始套接口提供了实现下线传输的功能,所以他被有不良目的所使用,进而在Window NT中安全成了一个问题。因此所以,只有管理员组中的成员才能创建SOCK_RAW类型的套接口。任何人都能在Windows NT创建一个原始的套接口,但是非管理员不能做任何事。因为绑定的API用WSAECCES会失败。Windows 95, Windows 98, and Windows Me没有增加任何限制。

  为在Windows NT上这种限制下工作,你可以通过创建下列注册变量和设置它的一整型值1为一个DWORD类型使检查原始套接口的安全性功能失效。

HKEY_LOCAL_MACHINE/System/CurrentControlSet
    /Services/Afd/Parameters/DisableRawSecurity
注册表改变以后,你需要重启可以机器。

  在创建套接口代码的例子中,我们使用了ICMP协议,但是你也可以分别通过IPPROTO_IGMP, IPPROTO_UDP, IPPROTO_IP, 或 IPPROTO_RAW来使用IGMP, UDP, IP, 或 raw IP。无论如何,注意在Windows 95(with Winsock 2), Windows 98, and Windows NT 4上,在创建原始套接口你只能够使用IGMP and ICMP
 creating raw sockets. The protocol flags IPPROTO_UDP, IPPROTO_IP, and IPPROTO_RAW require the use of the socket option
 IPPROTO_UDP, IPPROTO_IP, and IPPROTO_RAW协议标志的要求使用套接口选择IP_HDRINCL,这在那些平台上不支持。Windows Me , Windows 2000和后来版本支持IP_HDRINCL,所以它可能实现IP头(IPPROTO_RAW),TCP头(IPPROTO_TCP),和UDP头(IPPROTO_UDP).
 header (IPPROTO_UDP).
  一但使用合适的协议标志创建了原始套接口,你能够在send和receive调用中使用套接口句柄。当创建原始套接口,IP头会被包含在任何接收返回的数据里,而不管IP_HDRINCL选项是否被设置。应用程序会知道IP头的结构和确定IP头的长度进而找到在结收缓冲的有效负载数据。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值