为何SOCKET接收到PCHAR类型数据无法读取?(10分)

  • 主题发起人 主题发起人 dazzling
  • 开始时间 开始时间
TO:HammerLi,
老大怎么还不明白啊!?即使我在接收方限定长度为1,访问APPS时同样出错!
很显然,发送长度绝对大于1的!
如何访问APPS也接受长度没有直接关系,现在主要的原因是:
1、PCHAR是否真的不能收发?(如果不能,如何解释在TELNET看到接收的PCHAR型数据?如果行,为何无法访问APPS?)
2、如果不用PCHAR,用什么代替来收发变长数据?
 
daily up!
Mar6/06
 
PCHAR 如是查nil值 strlen( SI.apps)会报内存错误,strlen不能是个nil指针;
你试试: var p: PChar; begin p := nil; strlen(P); end;
dcsdcs, HammerLi说的是, 你可能发送的是指针, 既使可变长数据,也要分包发送.每包也要固定大小.不能直接发PChar,应該将SI.apps 定义成数组;
TELNET是PAnsiChar;PAnsiChar和PChar有点区别,delphi7中很容易发现,
PAnsiChar是指向AnsiChar,PChar是指向通用字符类型Char的。
//如果要用PChar可以这样Send and Recv
procedure TForm1.Button1Click(Sender: TObject);
var
P: PChar;
begin
GetMem(P, 12);
lstrcpy(P, 'test test');
ClientSocket1.Socket.SendText(P);
FreeMem(P);
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
lpBuf: PChar;
RecvLen: Integer;
begin
RecvLen := Socket.ReceiveLength;
GetMem(lpBuf, RecvLen + 1);
Socket.ReceiveBuf(lpBuf^, RecvLen);
Memo1.Lines.Add(Strpas(lpBuf));
FreeMem(lpBuf, RecvLen);
end;
 
但是我不是单独传送PCHAR啊,这个PCHAR只是SI数据结构的一个成员。
在接收方该如何处理呢?
比如这里, Socket.ReceiveBuf(lpBuf^, RecvLen);
其实它接收的是整个数据结构,如何通过SI逐个访问其成员呢
 
我说的是思路,关于 PChar 的问题 dcsdcs 已经说得很明白了,amwfhv 也给出解决的方法了,如果你实在想不出来就用最简单的方法,传送包使用二进制动态数组,分别写出两个功能函数将要发送的数据填充到发送包和将接收的数据包填入数据结构。你的结构中只有一个不定长数据项,应该很好解决这个问题。
 
用固定组数
 
既然是不定长的数据,我觉得这样定义结构比较合理:
把apps:pchar 改为: size:integer; 在发送数据的时候,这个不定长的数据紧跟在结构体后面填充buffer,结构体中写入数据大小。
接受时候填充si,知道了大小,紧接着读取si.size个字符到分配好空间的pchar中就可以了。
 
接受答案了.
 
后退
顶部