网络编程中忽略的问题百分相送

KuangXiang 2005-09-23 12:21:06
大家好:
今天在书写一个网络程序,而后突然思考到了一个很重要的问题,这里提出,欢迎大家讨论一下:
我抓到了一个包,这个包在内存中,我用了一个指针变量保存他,这个指针变量是这样定义的:
unsigned char *data;
现在这个包就在data指向的内存中了,同时,变量datalen中记录着这个包的长度,变量datalen是这样定义的:
unsigned short datalen;
一切看起来都没什么问题,现在思考的问题来了:
我想在data中找一个字符串"abcdefg",那么我的方法如下:
if((strstr(data,"abcdefg") != NULL)
........
首先,大家请帮忙看这个判断的写法有没有错误,如果有则错误在哪里,是否在某个特定的条件下会造成判断出错(明明没有,却找到了)或者是否会造成程序崩溃。
现在第二个问题又出来了,我想找data中位于第一个出现的/与第二个/之间的字符串,大家认为怎样写才是安全的,能保证程序的稳定性。
那么第三个问题如下:
大家看如下代码:
char *p1;char *p2;
char abc[] = "12345";
p1 = abc;
p2 = abc;
p2++;
if(p1 > p2)
显示 p1>p2
else
显示 p1 <= p2
代码完毕,这里向大家请教的是,这是一个指针直接比较的问题,指针就是地址,也就是地址比较,对于*p1 > *p2这种数值比较大家都十分清楚,但这请教的是直接的指针比较,对于指针比较,是否也是一种常用方法呢,是否是如果p1的地址小于p2,那么比较结果就是p1<p2呢,请用过指针比较的朋友给以指点。
...全文
77 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
daydaymissyou 2005-09-23
你是抓到的包, 应该按二进制处理吧, strstr能用吗?
抓到的包中间有0怎么办?你什么也找不到.

如果明确的说都是字符的数据,那就按zxyjyzxyjy(星星) 说的,初始化.
回复
koko1998 2005-09-23
对于你说的,那个2,如果你是查找字符/的话,最好不要使用strchr,而是使用_mbschr函数

原因:对于汉字,是有两个byte组成一个字,假如该字中,正好有一个byte是/对应的码的话,你的道德不就不正确了嘛。
回复
koko1998 2005-09-23
在网络编程中,数据的发送和接受都是有一定规则的,也就是按照某种协议封装包。一般,协议中已经规定了有效数据的长度,所以只要按照协议解析就可以了。
回复
zxyjyzxyjy 2005-09-23
对于你说的,可能接收到字符中串中间含有NULL的字符,接收时不是有长度吗,如果发送方真要把NULL放在中间发送,那你单独处理不就完了,更何况一般情况下在VC里不会这样做。
回复
zxyjyzxyjy 2005-09-23
何别那样复杂,在接收到数据时,肯定有长度吧,在分配空间时的长度加1,并对分配的空间初始化(这是编程的良好习惯)。对于第三个问题,你的是地址指针在比较大小。
回复
KuangXiang 2005-09-23
对于(2),我写了个程序进行测试,请看:
char abe[3] ;
abe[0] = '1';
abe[1] = '2';
abe[2] = '3';
char *paa = abe;
if(strchr(paa,'\xcc') != NULL)
AfxMessageBox("找到了");
这个程序没有对abe进行memset初始化,主要是因为问题中提到的data指向的内存数据的不确定性,为了模拟这种数据的不确定性,特意不对abe进行初始化,程序运行结果,显示“找到了”,这个时候paa指向的内存就是一块不可预料的内存了,也就是abe所代表的3个字节后的内存中了。
回复
KuangXiang 2005-09-23
(1)这个问题我认为不是这么简单,如果data中恰好不包含"abcdefg",但在data所指的内存中的datalen宽度之后的内存中包含这个字符串,并且在data中没有'\0'的话,我认为可能存在错误的判断,也就是明明没有找到,却报告找到了。
当然strstr的找法是假设这个data的数据中间没有\0的时候才能找成功,如果恰好data中有\0,而且"abcdefg"在\0之后,则肯定找失败。
(2)这个问题我认为也不这么简单,如果data中恰好没有'/'字符,而在data所指的内存中的datalen宽度之后的内存中包含这个字符(假定是data中没有'\0'),这个时候p1 = strchr(pHead, '/');得到的p1值将指向一个无法预料的内存块中去,很显然,对这个内存块操作就存在隐藏的危险。
以上(1)和(2)不知道其他朋友的建议,请指教。
(3)这个问题请大家继续关注和回答一下,目前还不敢确认。
回复
qc_jrj 2005-09-23
1. 应该没问题。
2. char *p1, *p2, *pHead;
pHead = data;
p1 = strchr(pHead, '/');
pHead += 1;
p2 = strchr(pHead, '/');

if ( p1 != NULL && p2 != NULL ) {
char szBuf[256];
p1 += 1;
int iSize = p2 - p1;
if ( iSize > 255 ) iSize = 255;
if ( iSize > 0 ) { // 第一个出现的/与第二个/之间的字符串
strncpy( szBuf, p1, iSize );
szBuf[iSize] = NULL;
}
}

3. 如果p1的地址小于p2,那么比较结果就是p1<p2
回复
相关推荐
Python神经网络编程
第1章 神经网络如何工作
【计算机网络】❤万字长文❤一篇搞定计网(持续更新...)
计算机网络已经像水、电、煤气这些基础设施一样,成为了我们生活不可或缺得一部分。 因特网概述: (1)网络、互联网(互连网)、英特网: 网络(Network):由若干结点(Node)和连接这些结点得链路(Link)...
傻瓜函数式编程
然后翻翻新闻还有那些技术网站上的更新,再过一遍编程论坛口水区里那些无聊的论战。最后从头把这些再看一次以免错过什么精彩的内容。然后就可以吃午饭了。饭饱过后,回来盯着IDE发一会呆,再看看邮箱,再去搞杯咖啡...
周志明:深入java虚拟机_虚拟面板:在低延迟环境使用Java
周志明:深入java虚拟机 Java越来越多地用于低延迟工作,而以前的C和C ++早已成为Java的实际选择。 InfoQ聚集了该领域的四位专家,讨论了驱动趋势的因素以及在这种情况下使用Java的一些最佳实践。...
计算机网络概述
计算机网络把许多计算机一起,而互联网则把许多网络连接在一起,是网络网络。因特网是世界上最大的互联网。 以小写字母i 开始的internet是通用名词,它泛指由多个计算机网络互连而成的网络。在这些网络之间的通信...
计算机网络学习笔记(详尽版)
我在大学期间的计算机网络学习笔记
DOS编程大全
目录 第一章 批处理基础  第一节 常用批处理内部命令简介  1、REM 和 ::  2、ECHO 和 @  3、PAUSE 暂停  4、ERRORLEVEL  5、TITLE 设置cmd窗口的标题  6、COLOR 设置cmd窗口前景和背景颜色 ... 
傻瓜函数编程
2006年6月19日,星期一 ###开篇 我们这些码农做事都是很拖拉的。每天例行报到后,先来点咖啡,看看...然后翻翻新闻还有那些技术网站上的更新,再过一遍编程论坛口水区里那些无聊的论战。最后从头把这些再看一次
网络运维词汇汇总
本篇之所以起该名字
Java编程经验汇总
想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自己的感受,写给软件学院的同仁们,帮助大家在技术的道路上少一点弯路。说得伟大一点是希望大家为软件学院争气,其实最主要的还是大家自身的进步提升?...
函数式编程
原文地址:http://www.defmacro.org/ramblings/fp.html 译文地址:... 开篇 我们这些码农做事都是很拖拉的。每天例行报到后,先来点咖啡,看看邮件还有RSS订阅的文章。然后翻翻新闻还有那些技术网站上
贾扬清:如何看待人工智能方向的重要问题
计算机视觉研究院长按扫描维码关注EDC.CV计算机视觉研究院专栏作者:Edison_G计算机视觉研究院一、人工智能算法人工智能的三大基石—算法、数据和计算能力,算法作为其中之一,是非常重...
一些好用的开源监控工具汇总
转载自:...amp;mid=2651009754&amp;idx=2&amp;sn=5d64b227bb28dfd590ab08df207e02b8&amp;chksm=bdbeca898ac9439f406e506cb63c6146d77b8cd4081794923d1dfba77cec0582558...
Amazon Dynamo论文中文版
原著: Werner Vogels 翻译: quest.run   (翻译本文,旨在讨论NoSQL时会有一个共同的Terminology,对于要实现NoSQL方案的同学,建议啃啃原文,因为很多术语在翻译成中文后语义差异很大,如quorum, ...
总结Java开发面试常问的问题,持续更新~
数据库 mysql redis java ...计算机网络 数据结构与算法 操作系统/Linux 设计模式 场景题和设计题 流行框架 数据库 mysql 为什么用自增列作为主键 如果我们定义了主键(PRIMARY KEY),那么Inn...
《计算机网络》笔记摘抄汇总
Spark的第一篇博客欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居...
一个计算机专业学生几年的编程经验汇总(好文要转)
一个计算机专业学生几年的编程经验汇总  绝对好文,该系列一共11篇,斑竹可以考虑置顶,各位坛友看完之后,java基础绝对有不小的提升!  =======================================================================...
一个计算机专业学生几年的Java编程经验汇总 ...
1. 关于动态加载机制 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当 然概念往往是先记住而后消化的,可有多少人真正去体会...
[Spark版本升级]-- spark-2.2.0发行说明
Spark-2.2.0版本发行时间:2017-7-11   一、Jira说明: ...amp;version=12338275   子任务 [ SPARK-1267 ] - 添加PySpark的pip安装程序 [ SPARK-3249 ] - ...
从高考到程序员的成长之路
风风雨雨四十载——高考恢复40年,中国士子的人生上升通道也已经被打通了40载。虽然社会的多元发展,已经淡化了“高考决定人生”的评判标准,但作为芸芸众生,参加高考并读完大学,也算是为人生奠定基石。
计算机网络_期末复习
目录 总结 TCP/IP的体系结构 第一章概述 计算机网络的定义 计算机网络的分类 互联网的组成 互联网的边缘部分 互联网核心部分 计算机网络性能指标 速率...
机器学习实践应用
内容简介 机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度等多门学科,专门研究计算机怎样模拟或...书涉及机器学习领域的多个典型算法,并详细给出了机器学习的算法流程。 本书...
Android 应用和系统优化V1.2
一年多年写了一篇简单的软件优化教程,给公司的同事使用。现在应该还不算过时,在过去一年里,在国家脱虚向实运动倡导下,一个个高科技企业如雨后春笋般诞生,对软件的优化和重构的需求也越来越多。...
比较两张图片差异
比较两张图片差异,代码收集于网上,码收集于网上
C语言--视频精讲
C语言作为被长期使用的编程语言,可以被运用到各种操作系统,游戏,开发中。本课程作为互联网上首家使用C99录制的C语言教程,展现了全面、专业。标准的C语言教程。可以帮助学员从基础开始一点点的深刻理解C语言。 a:0:{}
c#图片文字-字母-数字自动识别-深入代码-非常好
c#图片文字-字母-数字自动识别-深入代码-非常好
rtl8188eu_USB_linux.tar.gz
TP-LINK TL-WN725N V2 Linux 驱动安装
vs2013配置Qt5.7制作简单的音乐播放器
在VS2013配置Qt5.7制作的简单的音乐播放器,具有以下功能: 1.播放歌曲 2.添加歌曲 3.控制音量 4.换肤 5.本地搜索歌曲
24个带后台的小程序源码
24个带有后台的小程序源码下载,供大家交流学习(后台语言多种)
Java基础核心技术:面向对象编程(day05-day07)
本套Java视频完全针对初级学员,课堂实录,自发布以来,好评如潮!Java视频中注重与学生互动,讲授幽默诙谐、细致入微,覆盖Java基础所有核心知识点,同类Java视频中也是代码量大、案例多、实战性强的。同时,本Java视频教程注重技术原理剖析,深入JDK源码,辅以代码实战贯穿始终,用实践驱动理论,并辅以必要的代码练习。 通过20的课程学习,使学员掌握java核心语法、面向对象思想编程、异常处理、IO流、集合类、多线程、网络编程等。
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2005-09-23 12:21
社区公告
暂无公告