把32位的IP地址定义为上述联合体将使用户可以以字节、半字或字方式读写同一个IP地址。同志们,注意了,这个技巧在许多软件开发中定义数据结构时被广泛采用。
为了控制包的发送方式,我们可能会用到如下的这个十分重要的函数来设置套接字选项:
int setsockopt( SOCKET s, //套接字句柄 int level, //选项level,如SOL_SOCKET int optname, //选项名,如SO_BROADCAST const char* optval, //选项值buffer指针 int optlen //选项buffer长度 ); |
例如,当level为SOL_SOCKET时,我们可以设置布尔型选项SO_BROADCAST从而控制套接字是否传送和接收广播消息。
下面的代码通过设置IPPROTO_IP level的IP_HDRINCL选项为TRUE从而使能程序员亲自处理IP包报头:
//设置 IP 头操作选项 BOOL flag = TRUE; setsockopt(sd, IPPROTO_IP, IP_HDRINCL, (char*) &flag, sizeof(flag); |
下面的函数用于控制套接字:
int ioctlsocket( SOCKET s, long cmd, //命令 u_long* argp //命令参数指针 ); |
如下面的代码让socket接收所有报文(sniffer模式):
u_long iMode = 1; ioctlsocket(sd, SIO_RCVALL, & iMode); //让 sockRaw 接受所有的数据 |
Raw Socket发送报文
发送报文的函数为:
int sendto( SOCKET s, //套接字句柄 const char* buf, //发送缓冲区 int len, //要发送的字节数 int flags, //方式标志 const struct sockaddr* to, //目标地址 int tolen //目标地址长度 ); |
或
int send( SOCKET s, //已经建立连接的套接字句柄 const char* buf, int len, int flags ); |
send()函数的第1个参数只能是一个已经建立连接的套接字句柄,所以这个函数就不再需要目标地址参数输入。
共6页: 上一页 [1] [2] 3 [4] [5] [6] 下一页
|