带指针字段的结构发送问题(100分)

  • 主题发起人 主题发起人 xiao_min
  • 开始时间 开始时间
to 李崇文:
--〉SizeOf(TTest)似乎不足以放下所有内容吧。。。
内容存放在t.p中, 跟SizeOf(TTest)没什么关系,发送的时候只是吧对应结构的
变量指针发送过去,对方接收到就能取出内容,因此SendBuf函数中的Count参数
应为TTest所占用字节大小,在上面的例子中t.p实际指向'My Test String'的指针
他只需占用4个字节。

MY GOD,你把你系统中指针的地址传出去,别人在其他机器上能通过你的指针地址去取到数据???????????!!!!!!!!!!!!!!!

 
可能我的理解错了,因为我把Client/Server放在统一Application中了
 
faint
“这样对方取我的数据可能会出问题(是已经存在的系统,不是我做的,:))”
555,我早已经说过的呀,
害得我这么激动,差点儿就想开骂了,呵呵~~~
 
TBindConnect是什么?查不到。
你知道对方系统是怎么接收的吗?
总要有办法来应对recv, read等底层函数需要的接收长度参数吧?
 
放弃吧!愚蠢的问题!
从底层来讲,TCP/IP发送的都是字节流,指针指向的数据不会自动发送出去的,
必须你自己把结构/类进行序列化(比如stream),然后接受端再还原成结构/类。

目前没有现成的传输机制能够解决你的问题
 
to Sachow:
 结构定义在我的问题里就有呀
 
to 一个过客:
 我现在就是用的流来实现
 在提出这个问题之前,我就已经准备放弃传结构了,但是在这里查有关问题的过程中,
我发现有人回答问题时举了一个例子,他的结构中用的是动态数组,说是一起发出去不
就得了,而在我这里是无法实现的,所以我当然得问一下。。。。
 
带指针字段的结构是什么意思?你要做分布式或是多台计算机上实现数据库同步问题?
 
to whitesun:
  就是一个结构类型(TYPE OF RECORD),其中有的段是指针类型呀,我的问题
中不是已经写出来了?
 
哦,都怪我自己粗心,没看到你的结构类型就是那个。别小看THeader的那个整型变量,它
们可能就是结构定义的关键所在。你把完整的头文件给出来看看行吗?列出所有用到的所有
结构的所有成员。
 
to Sachow:
  不要理那个,就这个结构通过就可以:
test=packed record
a:integer;
b:pchar;
end;
 
我认为我们的讨论是绕远了点,让我们看清问题的关键:1、对方socket在接收你发送的数据
时,一定要设一个接收长度值,而且这个接收长度值必须是效的(大于或等于你发送的长度),
否则将收不到正确的数据,这一点他们肯定是做到了。2、必须保证发过去的东西是有效的数
据,而不是指针。
我现在需要确认的是:已经试过,确定对方系统收到你发送的定长数据是无效的,还是尚未
试过,只是你认为会有错。
 
" System_id:pchar; //max:16
Password:pchar; //max:9
System_type:pchar; //max:13
  ABC#0#0A#0:这表示分别是ABC,空串,A
  那么:如果用静态数组ABC#0#0#0#0#0.....#0#0#0#0....A#0#0
  你认为该如何取值?"
  如果多出来一堆#0,对方应该无法分析的
  另:不多#0,对方肯定能分析 (程序已通过,是SMPP的,在公司里无法测试,得现场
去搞才行)
    那个程序是别人做的,做得特分散,我现在把这部分要封装一下,以后我们的产品
中直接调我的控件,设几个参数,就可以解决大多数的问题,然后其他数据都可以从我产生
的相应事件中去处理
 
唉,你有没有看我上面说的。。。。
“对方在收到数据包后,以相同的格式(长度)来取值时,把第1到第4字节读为第一个串值,
把第5到第8字节读为第二个串值,把第9到第12个字节读为第三个串值,就可以正确地读出
数据了,它不用管a里面是什么,有几个'/0',b,c以此类推。”
  照你这样说的当然是好的呀,可是偏偏人家服务器不是这样取的呀。。。
  “不多#0,对方肯定能分析”,说明不可能是按最大字节去取的呀。。。
  
 
System_id:pchar; //max:16
Password:pchar; //max:9
System_type:pchar; //max:13
这不是有限定长度吗,如果不定长的话,何必又约定一个Max值呢,那样想发多长就发就行
了。估计对方是以最大可靠长度来接收的,它一次接收的大小是结构中其它所有整形变量
的尺寸+16+9+3,然后以字符串结束符来分开各个字符串,如果能确定他们是这样做的,那
倒是有办法了。
 
faint,faint,faint
 我不是已经说了么?不定长的数据都已经测试通过了的,如果是定长接收的话,怎么可能
测试通过?
 
OK,我现在总算明白了。现在可以盖棺定论了——对于此问题的回答是否定的。
服务器采用这种收发数据包的方式是为了节省系统资源(内存和磁盘空间)。
我上了很好的一课!
 
to Sachow:
谢谢参与讨论
过几天再不行,我就结束它了。。。
 
你好,xiao_min,你这是SMPP协议吧,
你可以定义array [0..16] of char ,然后把后面的#0变成#20,只剩最后一个#0
或使用pchar,然后序列化到tmemorystream 中,发送tmemorystream,
欢迎来信讨论,johnsun@8898.net
 
后退
顶部