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

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呢,请用过指针比较的朋友给以指点。
...全文
142 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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