请问如何将自定义结构的内容以流的方式传递给SOCKET的SERVER? (100分)

  • 主题发起人 主题发起人 dzogchen
  • 开始时间 开始时间
D

dzogchen

Unregistered / Unconfirmed
GUEST, unregistred user!
type
STUDPACKETHEAD = record
packettype: Word; //包头
service_type: Byte; //类别
length: Word; //长度
pDATA DATA; //指向数据块
end {STUDPACKETHEAD};

STUDPACKETCONTENT = record //数据块
dest_address: Array[0..21-1] of Byte; //家庭住址
source_address: Array[0..21-1] of Byte; //在校寝室
stud_type: Word; //学生类别
TETS_time: Array[0..17-1] of Byte; //考试时间
valid_time: Array[0..17-1] of Byte; //有效时间
sm_length: Byte; //介绍长度
studmessage: Array[0..180-1] of Byte; //基本信息
CW_type: Array[0..2-1] of Byte; //费用类别
CW_code: Array[0..6-1] of Byte; //财务科目
end {STUDPACKETCONTENT};

STUDPACKETSINGLE = record
smpackethead: SMPACKETHEAD;
smpacketcontent: SMPACKETCONTENT;
end {STUDPACKETSINGLE};

请问如何将 以上结构的内容以流的方式传递给SOCKET的SERVER,谁愿意就这个
协议体,帮我D7做一个SOCKET的CLIENT/SERVER的程序,我就是不明白怎么以流
方式传递的?
 
别人写的,我是抄的。呵呵

先把自定义记录类型读到Stream,再转成OleVariant,传递到另一方后,OleVariant转换
成Stream,再读出记录。对象也可以这样。
用惯了,也没有再去找其他简单方法!
procedure VariantToStream(const Data: OleVariant; Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1); //assuming low bound = 0
finally
VarArrayUnlock(Data);
end;
end;

function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin
Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0; //start from beginning of stream
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;
 
哎呀,看不懂
 
大家都给点意见呀
 
前面的贴子有不少例子,下载一个离线包看看吧
 
真是搞不懂,为什么喜欢转一次,直接用sendbuf不就行了,效率高,何必用什么流,
流也是一个结构而已,
 
张无忌,请详细给予帮助
 
《我是来自成都的男子汉,有三年开发经验。愿于各位共同进步,同创末来。QQ:156409293》
 
张无忌请你能够帮助我.
 
不知道你具体的需求呀,我怎么给你写代码了?
 
要发送的结构最好是定长的,这样很好处理,只要用SendBuf(WinSock API用write或send),
长度用SizeOf(要发送的结构)即可,如果非要发送不定长的结构,就得用Variant来做,像
jianl贴来的那样,但那段代码也要修改一下才能适用于你。
 
Use SendBuffer 不是很好吗?
干嘛非要用Stream呀
 
张无忌
我就是想知道这个记录是怎么传递的.这个结构好象还嵌套着一个记录.用SENDBUF就SENDBUF,没有关系,反正我是初学,会一个是一个
 
发嵌套在最外面的一个结构就行了,比如说STUDPACKETSINGLE是外面的一个结构,就发它就
可以了:
procedure TForm1.Button2Click(Sender: TObject);
var
ST: STUDPACKETSINGLE;
begin
ST.smpackethead.packettype := 1;
//... 结构成员赋值
ClientSocket1.Socket.SendBuf(ST, SizeOF(ST)); //发送
end;

你给出的结构定义有误,照那个定义是编译不过去的。注意:结构里不能有指针、动态数组
或String等不能通过SizeOf()取得实际长度的成员。
 
STUDPACKETCONTENT = record //数据块
dest_address: Array[0..21-1] of Byte; //家庭住址
source_address: Array[0..21-1] of Byte; //在校寝室
stud_type: Word; //学生类别
TETS_time: Array[0..17-1] of Byte; //考试时间
valid_time: Array[0..17-1] of Byte; //有效时间
sm_length: Byte; //介绍长度
studmessage: Array[0..180-1] of Byte; //基本信息
CW_type: Array[0..2-1] of Byte; //费用类别
CW_code: Array[0..6-1] of Byte; //财务科目
====================================================================
你是说这里错了吗?
 
这个程序原来是C的,我只是转换过来的.你看看原来的结构,看我改的结构对不对.
struct studPACKETHEAD
{
unsigned int packettype;
unsigned char service_type;
unsigned int length;
};

struct SMPACKETCONTENT
{
unsigned char dest_address[21];
unsigned char source_address[21];
unsigned int stud_type;
unsigned char test_time[17];
unsigned char valid_time[17];
unsigned char sm_length;
unsigned char studmessage[180];
unsigned char cw_type[2];
unsigned char cw_code[6];
};
 
type
STUDPACKETHEAD = record
packettype: Word; //包头
service_type: Byte; //类别
length: Word; //长度
pDATA DATA; //指向数据块
end {STUDPACKETHEAD};

1、在32位系统中,unsigned int = unsigned long = DWORD,取值范围为(0至2^32-1),
因此Word不能与之匹配,需要用LongWord。
2、缺乏DATA的定义且变量声明方式不对,这应该只是一个笔误吧。注意而且它不能是指针
对象。
 
那么我究竟应该怎样转换这个的C结构为DELPHI的?
 
后退
顶部