我在编一个监控数据包软件的时候,为什么在数据包里面,接收的数据是英文能够看到,中文却变成乱码之类的???(50分)

  • 主题发起人 主题发起人 lpzst002
  • 开始时间 开始时间
L

lpzst002

Unregistered / Unconfirmed
GUEST, unregistred user!
该怎么转换才能看到数据包里面的中文呢?谢谢,请大家指教指教!!![:)]
 
配对问题,一个中文字由两个大于160的AscII码构成,
中文字前如果有一个大于160的AscII码,就会造成整串字乱码,
你只有分析包数据,找到文本信息的起始处。
 
那文本信息的起始处又该怎么找到,又该怎么分析啊?
 
要看什么协议,TCP的是:
源端口:16位;
目的端口:16位
序列码:32位,当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1;
确认码:32位,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码;
数据偏移量:4位,指示何处数据开始;
保留:6位,这些位必须是0;
控制位:6位;
窗口:16位;
校验位:16位;
优先指针:16位,指向后面是优先数据的字节;
选项:长度不定;但长度必须以字节记;选项的具体内容我们结合具体命令来看;
填充:不定长,填充的内容必须为0,它是为了保证包头的结合和数据的开始处偏移量能够被32整除;
请参看相应的RFC文档
 
请问RFC在哪下载????有没有这方面的代码可参考,不然现在看到这些,简直是一头雾水
 
虽然我分不多,但是谁要是能帮我解决这个问题,我再加200分啊,绝不食言啊
 
好像发个电子邮件就能自动给你发过来。。。,我的书上又,回去给你查下。。。
 
谢谢迈克老狼,我的EMail:lpzst_stb@21cn.net
 
还有谁知道的,可以发表你们的议论啊,怎么没人回答了??
 
LUCKM说的方法只能用于明文的数据包
 
高手到哪去了啊????
难道就没有大富翁回答这个问题?????
 
你在什么协议下做呀?
查询RFC可到下面的网站:
http://www.rfc-editor.org/
 
我用得是tcp-ip协议
 
有没有这方面比较详细的资料呢????
 
大富翁的高手到哪去了?????????
 
如何得到包的?lpzst002大侠!我太佩服您了!可以给一个小例子让我学习一下吗?
 
我的email:chen777@cmmail.com
 
to 晨晨,可以啊,不过你得帮忙搞定我这个问题,我现在想做个联众帮手,到时你分又能得到,
而且我将把程序发给你
 
TCP协议是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结构比较复杂.

0 4 8 10 16 24 32
-------------------------------------------------------------------
| 源端口 | 目的端口 |
-------------------------------------------------------------------
| 序列号 |
------------------------------------------------------------------
| 确认号 |
------------------------------------------------------------------
| | |U|A|P|S|F| |
|首部长度| 保留 |R|C|S|Y|I| 窗口 |
| | |G|K|H|N|N| |
-----------------------------------------------------------------
| 校验和 | 紧急指针 |
-----------------------------------------------------------------
| 选项 | 填充字节 |
-----------------------------------------------------------------

TCP的结构在中定义为:
struct tcphdr
{
u_int16_t source;
u_int16_t dest;
u_int32_t seq;
u_int32_t ack_seq;
#if __BYTE_ORDER == __LITTLE_ENDIAN
u_int16_t res1:4;
u_int16_t doff:4;
u_int16_t fin:1;
u_int16_t syn:1;
u_int16_t rst:1;
u_int16_t psh:1;
u_int16_t ack:1;
u_int16_t urg:1;
u_int16_t res2:2;
#elif __BYTE_ORDER == __BIG_ENDIAN
u_int16_t doff:4;
u_int16_t res1:4;
u_int16_t res2:2;
u_int16_t urg:1;
u_int16_t ack:1;
u_int16_t psh:1;
u_int16_t rst:1;
u_int16_t syn:1;
u_int16_t fin:1;
#endif
u_int16_t window;
u_int16_t check;
u_int16_t urg_prt;
};
source发送TCP数据的源端口
dest接受TCP数据的目的端口
seq标识该TCP所包含的数据字节的开始序列号
ack_seq确认序列号,表示接受方下一次接受的数据序列号.
doff数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5
urg如果设置紧急数据指针,则该位为1
ack如果确认号正确,那么为1
psh如果设置为1,那么接收方收到数据后,立即交给上一层程序
rst为1的时候,表示请求重新连接
syn为1的时候,表示请求建立连接
fin为1的时候,表示亲戚关闭连接
window窗口,告诉接收者可以接收的大小
check对TCP数据进行较核
urg_ptr如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值
通过分析包结构,获取到数据的偏移量后,你就可以取得真正的数据内容,
当然,加密数据你可以通过相应方式解密还原.
如果上面不够的话,你可以到我说的网站查看 RFC793
 
to lpzst002
当然好啊!只是我的水平很次,可能没有能力帮您搞定这个问题。[:(]
我听以前老师告诉说,网络字节顺序和X86机器上的不一样。
你试试换个字节顺序看能行不?
 
后退
顶部