段错误...位置很奇怪...

Armeng 2009-04-10 11:10:15
linux下用gdb调试
错误地点竟然是
int size_udp=8;


达人帮忙看下这段代码 = =


void
got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
static int count = 1; /* packet counter */

/* declare pointers to packet headers */
const struct sniff_ethernet *ethernet; /* The ethernet header [1] */
const struct sniff_ip *ip; /* The IP header */
const struct sniff_tcp *tcp; /* The TCP header */
const struct sniff_udp *udp; /* The UDP header */
const char *payload; /* Packet payload */

int size_ip;
int size_tcp;
int size_udp = 8;
int size_payload;

printf("\nPacket number %d:\n", count);
count++;

/* define ethernet header */
ethernet = (struct sniff_ethernet*)(packet);

/* define/compute ip header offset */
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
size_ip = IP_HL(ip)*4;
printf("IP header length:%u bytes\n",size_ip);
if (size_ip < 20) {
printf(" * Invalid IP header length: %u bytes\n", size_ip);
return;
}

/* print source and destination IP addresses */
printf(" From: %s\n", inet_ntoa(ip->ip_src));
printf(" To: %s\n", inet_ntoa(ip->ip_dst));

/* determine protocol */
switch(ip->ip_p) {
case IPPROTO_TCP:
printf(" Protocol: TCP\n");
break;
case IPPROTO_UDP:
printf(" Protocol: UDP\n");
break;
case IPPROTO_ICMP:
printf(" Protocol: ICMP\n");
return;
case IPPROTO_IP:
printf(" Protocol: IP\n");
return;
default:
printf(" Protocol: unknown\n");
return;
}

/*
* OK, this packet is udp.
*/

/* define/compute tcp header offset */
udp = (struct sniff_udp*)(packet + SIZE_ETHERNET + size_ip);
if (size_udp < 8) {
printf(" * Invalid udp header length: %u bytes\n", size_tcp);
return;
}

printf(" Src port: %d\n", ntohs(udp->uh_sport));
printf(" Dst port: %d\n", ntohs(udp->uh_dport));

/* define/compute udp payload (segment) offset */
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_udp);

/* compute udp payload (segment) size */
size_payload = ntohs(ip->ip_len) - (size_ip + size_udp);

int seclen;
seclen= ntohs(ip->ip_len)+16;
//char *data = new char[seclen];
char *data = (char *)malloc(seclen*sizeof(char));
data[0] = (char)0x3E;
data[1] = (char)0xB | (char)((seclen-3)>>8);
data[2] = (char)(seclen-3);
data[3] = (char)0x70;
data[4] = (char)0x25;
data[5] = (char)0xB1;
data[6] = (char)0x00;
data[7] = (char)0x00;
data[8] = (char)0x40;
data[9] = (char)0x5E;
data[10] = (char)0x00;
data[11] = (char)0x01;
memcpy(data+12,*packet,ntohs(ip->ip_len));
//for(int i=0;i<s)
printf("%s\n",data);

return;
}
...全文
150 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
morris88 2009-04-10
  • 打赏
  • 举报
回复
    /* define/compute udp payload (segment) offset */
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_udp);

/* compute udp payload (segment) size */
size_payload = ntohs(ip->ip_len) - (size_ip + size_udp);

int seclen;
seclen= ntohs(ip->ip_len)+16;
//char *data = new char[seclen];
char *data = (char *)malloc(seclen*sizeof(char));
data[0] = (char)0x3E;
data[1] = (char)0xB | (char)((seclen-3)>>8);
data[2] = (char)(seclen-3);
data[3] = (char)0x70;
data[4] = (char)0x25;
data[5] = (char)0xB1;
data[6] = (char)0x00;
data[7] = (char)0x00;
data[8] = (char)0x40;
data[9] = (char)0x5E;
data[10] = (char)0x00;
data[11] = (char)0x01;
memcpy(data+12,*packet,ntohs(ip->ip_len));
//for(int i=0;i<s)
printf("%s\n",data);


其中:
    memcpy(data+12,*packet,ntohs(ip->ip_len));

貌似该为:
    memcpy(data+12, packet, ntohs(ip->ip_len));



WOBUGUAN 2009-04-10
  • 打赏
  • 举报
回复
我也觉得这行有问题,
memcpy(data+12,*packet,ntohs(ip->ip_len));
我总觉得不该有那个星号
zbing0203 2009-04-10
  • 打赏
  • 举报
回复
函数在这之前做了什么 有内存泄漏吗
  • 打赏
  • 举报
回复
memcpy(data+12,*packet,ntohs(ip->ip_len));

这里没越界吧?

int size_udp = 8;
这么神奇?难道机器出问题了。
dongpy 2009-04-10
  • 打赏
  • 举报
回复
不太可能吧,除非栈帧寄存器的值被破坏了。调试能看到ebp的值吗
yashuwa0622 2009-04-10
  • 打赏
  • 举报
回复
udp = (struct sniff_udp*)(packet + SIZE_ETHERNET + size_ip);
if (size_udp < 8) {
printf(" * Invalid udp header length: %u bytes\n", size_tcp);
return;
}

这个中间是不是漏了什么。。
Armeng 2009-04-10
  • 打赏
  • 举报
回复
哦 那个是笔误...
*packet 已经改成packet了,不过问题依旧...

jackyjkchen 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 morris88 的回复:]
C/C++ code /* define/compute udp payload (segment) offset */
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_udp);

/* compute udp payload (segment) size */
size_payload = ntohs(ip->ip_len) - (size_ip + size_udp);

int seclen;
seclen= ntohs(ip->ip_len)+16;
//char *data = new char[seclen];
char *data = (char *)malloc(seclen*sizeof(char));

[/Quote]

正解,地址应该向地址赋值,加了*就变成元素了
mosaic 2009-04-10
  • 打赏
  • 举报
回复
估计got_packet之前的代码就出问题了。
Django框架概述Django 是用 Python 开发的一个免费开源的 Web 框架,提供了许多网站后台开发经常用到的模块,使开发者能够专注于业务部分。并且囊括的 Web 应用部分可以用于快速搭建高性能、优雅的网站。并且提供了通用 Web 开发模式的高度抽象,通过 DRY(Don't Repeat Yourself,不要重复自己)的理念为频繁进行的编程作业提供了快速解决方法。Django的特点1.自带管理后台 简单的几行代码就可以让目标网站拥有一个强大的管理后台,轻松对内容进行增加、删除、修改与查找操作,以及很方便地定制搜索、过滤等操作,因此特别适合用于内容管理平台。 2.灵活的路由系统 定义优雅的访问地址,还可伴随项目进行配置。 3.强大的数据库 ORM 强大的数据库操作接口(QuerySet API)可以轻松执行原生 SQL。 4.易用的模板系统 基于前后端分离系统可用 Django 开发 API,不使用模板系统,并也可以轻易替换成其他模板。 5.缓存系统 与 Memcached,Redis 等缓存系统联合使用,获得更快的加载速度,并且配置简单。 6.国际化支持 支持多语言应用,允许定义翻译的文字,轻松翻译成不同国家/地区的语言。 Django 发布情况功能版本(A.B,A.B+1,如 2.0,2.1 等)大约每 8 个月发布一次。这些版本将包含新功能以及对现有功能的改进等,也可能包含与上一个版本不兼容的功能,详细的说明在版本的发布日志(Release Notes)中可以查阅到。补丁版本(A.B.C,如 2.1.3)会根据需要发布,以修复错误和安全问题。这些版本将与相关的功能版本 100% 兼容,除非是出于安全原因或为了防止数据丢失而无法做到 100% 兼容。正因为如此,如果之前使用的是 Django 3.0,现在最新的版本是 Django 3.0.3,那么可以放心将 3.0 版本升级到 3.0.3版本。某些功能版本被指定为长期支持(LTS)版本,这种稳定版本通常自发布之日起 3 年以内,会持续发布安全和关键补丁,即所谓提供持续稳定的支持。从 Django 2.0 开始,它不再支持 Python 2。下图演示了 Django 各版本的发布情况和支持计划 Django 的 MVT 架构简介Django 是一个 Python Web 框架,和大多数框架一样支持 MVC模式。通过学习 MVC(Model-View-Controller)模式,了解 Django MVT(Model-View-Template)的不同之处。1.MVC 模式 MVC 是开发 Web 应用程序的一种软件设计模式,其中各部分功能如下: 模型(Model):位于模式底层,负责管理应用程序的数据。它处理来自视图的请求,并且响应来自控制器的指令以更新自身。 视图(View):负责向用户以特定格式呈现全部或部分数据。 控制器(Controller):控制模型和视图之间交互的代码。MVT 模式 MVT 与 MVC 区别在于 Django 本身已经实现了控制器(Controller)这部分的功能,暴露给开发者的是模板(Template)。所以可以简单认为 Django 中的模板是 HTML 文件,但其支持 Django 的模板语言。这种模板语言简单来说就是通过占位符、循环、逻辑判断等来控制页面上的内容展示。 Django 和其他 Python Web 框架的对比用于 Python Web 开发的框架有很多,比如 Flask、Bottle、Pyramid、Webpy 等。1. Django 和 Flask 的对比 Flask 是小而精的微框架(Micro Framework),它不像 Django 那样大而全。如果使用 Flask 开发,开发者需要自己决定使用哪个数据库 ORM、模板系统、用户认证系统等,需要自己去组装这些系统。与 Django 开发相比,开发者在项目开始的时候可能需要花更多的时间去了解、挑选各个组件,正因为这样,Flask 开发的灵活度更高,开发者可以根据自己的需要去选择合适的插件。由于是自己一步步地将整个系统组装起来的,因此也比较容易了解各个组件部分。当然,Flask 历史相对更短,第三方 App 自然没有 Django 那么全面。2. Django 和 Tornado 的对比 Tornado 是一个 Python Web 框架和异步网络库,最初由 FriendFeed 开发,当初设计它的目的是为了解决 10000 个并发连接(C10K 问题)。传统的 Apache 服务器会为每个 HTTP 请求连接一个线程,而在大多数 Linux 发行版中默认线程堆(Heap)大小是 8MB,当连接数量过多时,这种线程池的方式极易耗光服务器上的所有资源。Tornado 会把等待资源的操作挂起,当数据准备好时,再回调相应的函数。通过使用非阻塞网络 I/O,Tornado 可以轻松应对数万个连接。因而 Tornado 也就成为长轮询,是 WebSocket 和其他需要与每个用户建立长期连接的应用程序的理想选择。和 Django 相比,使用 Tornado 编写异步代码对于开发者来说,没有 Django 或 Flask 编写同步代码那么简单、直接和高效。使用 Python 进行 Web 开发合适吗?Python 简单易学、上手快速,成为很多程序员喜爱的编程语言。使用 Python 进行 Web 应用开发,无疑能够加快需求实现的速度,快速迭代和验证产品的原型。有些人可能会有疑问:Python 性能不够好,用来开发 Web 是不是不太合适?Python 在性能上确实无法和 C语言、Java 等语言相比,但在大部分情况下使用 Python 开发是可以满足性能需求的,并且很多时候程序性能不够好,这不是语言本身的问题,而是架构设计、缓存设计、数据结构算法的选用以及开发人员编程水平等引起的问题。总之,使用 Python 语言进行 Web 开发有独特的优势,通常能满足大部分应用场景的需求。 

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧