使用libnet开发包,但是却没有将数据发出(通过Ethereal抓包或观察hub的灯可以肯定没数发出),好奇怪!请高人帮我看看,谢谢xp+sp2 系统,WinPcap3.1源代码如下,编译通过了。#include <win32/libnet.h>void main()
{
int packet_size;
/* 构造的数据包大小 */
libnet_t *l;
/* libnet句柄 */
char *device = NULL;
/* 设备变量 */
char *destination_ip_str = "192.168.0.2";
/* 目的IP地址字符串变量,可以指定任意一个合法的IP地址 */
char *source_ip_str = "192.168.0.1";
/* 源IP地址字符串变量,可以指定任意一个合法的IP地址 */
u_char hardware_source[6] =
{
0x00, 0x40, 0xca, 0xb9, 0x5c, 0x4e
};
/* 源硬件地址,可以指定任意的MAC地址 */
u_char hardware_destination[6] =
{
0x00, 0x05, 0x5d, 0xf5, 0x6a, 0x9e
};
/* 目的硬件地址,可以指定任意的MAC地址 */
u_long destination_ip;
/* 目的IP地址 */
u_long source_ip;
/* 源IP地址 */
char error_buffer[LIBNET_ERRBUF_SIZE];
/* 存放错误信息 */
libnet_ptag_t ip_protocol_tag = 0;
/* IP协议块的协议标记 */
libnet_ptag_t ethernet_protocol_tag = 0;
/* 以太网协议块的协议标记 */
u_short protocol = IPPROTO_UDP;
/* 表示IP上一层的协议类型,在这里是UDP协议 */
u_char payload[255] = "";
/* 负载的内容,初始值为空 */
u_long payload_size = 0;
/*
* 负载的长度,初始值为0 ;
* 对libnet进行初始化操作
*/
l = libnet_init(LIBNET_LINK, /* libnet类型 */device, /* 网络设备 */error_buffer);
/* 错误信息 */
destination_ip = libnet_name2addr4(l, destination_ip_str, LIBNET_RESOLVE);
/* 把目的IP地址字符串类型转换为网络顺序的数值 */
source_ip = libnet_name2addr4(l, source_ip_str, LIBNET_RESOLVE);
/* 把源IP地址字符串类型转换为网络顺序的数值 */
strncpy(payload, "test", sizeof(payload) - 1);
/* 构造负载的内容,此时的内容为"test",只是测试 */
payload_size = strlen(payload);
/* 计算负载内容的长度 */
ip_protocol_tag = libnet_build_ipv4(
/* 构造IP协议块 */
LIBNET_IPV4_H + payload_size,
/* IP协议块的整个长度,在这里是IP协议头加上负载的长度 */
0,
/* 服务质量,在这里为0 */
242,
/* IP标记 */
0,
/* IP紧急指针 */
64,
/* 生存时间 */
protocol,
/* 上层协议类型 */
0,
/* 校验和,此时为0,表示由libnet自动计算 */
source_ip,
/* 源IP地址 */
destination_ip,
/* 目的IP地址 */
payload,
/* 负载内容 */
payload_size, /* 负载内容的大小 */l,
/* libnet句柄,由libnet_init()函数生成的 */
ip_protocol_tag /* IP协议块标记,此时为0,表示构造新的IP协议块 */
);
ethernet_protocol_tag = libnet_build_ethernet(
/* 构造一个以太网协议块 */
hardware_destination,
/* 以太网目的地址 */
hardware_source,
/* 以太网源地址 */
ETHERTYPE_IP,
/* 上层协议类型,在这里必须是IP协议 */
NULL,
/* 负载,这里为空 */
0,
/* 负载大小 */
l,
/* libnet句柄 */
ethernet_protocol_tag /* 以太网协议块标记,此时为0,表示构造新的以太网协议块
* */
);
packet_size = libnet_write(l);
/* 发送数据包 */
printf("发送一个%d字节的IP数据包\n", packet_size);
libnet_destroy(l);
/* 销毁libnet */
}
{
int packet_size;
/* 构造的数据包大小 */
libnet_t *l;
/* libnet句柄 */
char *device = NULL;
/* 设备变量 */
char *destination_ip_str = "192.168.0.2";
/* 目的IP地址字符串变量,可以指定任意一个合法的IP地址 */
char *source_ip_str = "192.168.0.1";
/* 源IP地址字符串变量,可以指定任意一个合法的IP地址 */
u_char hardware_source[6] =
{
0x00, 0x40, 0xca, 0xb9, 0x5c, 0x4e
};
/* 源硬件地址,可以指定任意的MAC地址 */
u_char hardware_destination[6] =
{
0x00, 0x05, 0x5d, 0xf5, 0x6a, 0x9e
};
/* 目的硬件地址,可以指定任意的MAC地址 */
u_long destination_ip;
/* 目的IP地址 */
u_long source_ip;
/* 源IP地址 */
char error_buffer[LIBNET_ERRBUF_SIZE];
/* 存放错误信息 */
libnet_ptag_t ip_protocol_tag = 0;
/* IP协议块的协议标记 */
libnet_ptag_t ethernet_protocol_tag = 0;
/* 以太网协议块的协议标记 */
u_short protocol = IPPROTO_UDP;
/* 表示IP上一层的协议类型,在这里是UDP协议 */
u_char payload[255] = "";
/* 负载的内容,初始值为空 */
u_long payload_size = 0;
/*
* 负载的长度,初始值为0 ;
* 对libnet进行初始化操作
*/
l = libnet_init(LIBNET_LINK, /* libnet类型 */device, /* 网络设备 */error_buffer);
/* 错误信息 */
destination_ip = libnet_name2addr4(l, destination_ip_str, LIBNET_RESOLVE);
/* 把目的IP地址字符串类型转换为网络顺序的数值 */
source_ip = libnet_name2addr4(l, source_ip_str, LIBNET_RESOLVE);
/* 把源IP地址字符串类型转换为网络顺序的数值 */
strncpy(payload, "test", sizeof(payload) - 1);
/* 构造负载的内容,此时的内容为"test",只是测试 */
payload_size = strlen(payload);
/* 计算负载内容的长度 */
ip_protocol_tag = libnet_build_ipv4(
/* 构造IP协议块 */
LIBNET_IPV4_H + payload_size,
/* IP协议块的整个长度,在这里是IP协议头加上负载的长度 */
0,
/* 服务质量,在这里为0 */
242,
/* IP标记 */
0,
/* IP紧急指针 */
64,
/* 生存时间 */
protocol,
/* 上层协议类型 */
0,
/* 校验和,此时为0,表示由libnet自动计算 */
source_ip,
/* 源IP地址 */
destination_ip,
/* 目的IP地址 */
payload,
/* 负载内容 */
payload_size, /* 负载内容的大小 */l,
/* libnet句柄,由libnet_init()函数生成的 */
ip_protocol_tag /* IP协议块标记,此时为0,表示构造新的IP协议块 */
);
ethernet_protocol_tag = libnet_build_ethernet(
/* 构造一个以太网协议块 */
hardware_destination,
/* 以太网目的地址 */
hardware_source,
/* 以太网源地址 */
ETHERTYPE_IP,
/* 上层协议类型,在这里必须是IP协议 */
NULL,
/* 负载,这里为空 */
0,
/* 负载大小 */
l,
/* libnet句柄 */
ethernet_protocol_tag /* 以太网协议块标记,此时为0,表示构造新的以太网协议块
* */
);
packet_size = libnet_write(l);
/* 发送数据包 */
printf("发送一个%d字节的IP数据包\n", packet_size);
libnet_destroy(l);
/* 销毁libnet */
}
解决方案 »
- Onsize中MoveWindow移动EditBox老是出错
- TTS--如何使Vista中lili发音能在XP中使用?
- 关于richeditbox的问题
- pe文件中的Filealignment和磁盘簇是一样的么,它们之间有什么关系
- 我在写编一个网络应用协议分析平台,现在碰到了一个界面刷新速度问题,想请教大牛们
- 为什么对拆分窗口再分一次这一行就被被压扁了?大家帮帮忙啊!
- 今天向老板交辞呈
- 关于GPRS的几个问题?
- 如何使用多个计时器?
- ADO连接打开ACCESS,catch异常返回:无效指针
- 为什么我用CreateWindowEx(0,WC_TREE,WS_CHILD|TVS_TRACKSELECT.....)创建的树,用SPY++跟踪没有TVM_GETIDENT消息
- 实现winamp中语音波动图是怎么实现的?
执行后,
printf("发送一个%d字节的IP数据包\n", packet_size);
显示发送了38个字节的数据。但实际并没有发出任何数据。我关掉了机器上的防火墙。
到底是怎么回事啊!