代码如下:
procedure TFrm_Main.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
p: pchar;
lh: longint;
Count, i: integer;
ReceStr: string;
begin
//p := nil;
while Socket.ReceiveLength > 0 do
begin
lh := Socket.ReceiveLength;
GetMem(p, lh);
try
Socket.ReceiveBuf(p^, Socket.ReceiveLength);
ReceStr := StrPas(p);
Memo_Log.Lines.Add(ReceStr); //memo上显示的是乱码
Count := SS.Socket.ActiveConnections;
for i := 0 to Count - 1 do
begin
SS.Socket.Connections[i].SendBuf(p^, lh);//发出的数据在C#的窗体上 可以正常显示
end;
finally
FreeMem(p);
end;
end;
end;//s是不是PChar类型的问题呀??
谢谢了
procedure TFrm_Main.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
p: pchar;
lh: longint;
Count, i: integer;
ReceStr: string;
begin
//p := nil;
while Socket.ReceiveLength > 0 do
begin
lh := Socket.ReceiveLength;
GetMem(p, lh);
try
Socket.ReceiveBuf(p^, Socket.ReceiveLength);
ReceStr := StrPas(p);
Memo_Log.Lines.Add(ReceStr); //memo上显示的是乱码
Count := SS.Socket.ActiveConnections;
for i := 0 to Count - 1 do
begin
SS.Socket.Connections[i].SendBuf(p^, lh);//发出的数据在C#的窗体上 可以正常显示
end;
finally
FreeMem(p);
end;
end;
end;//s是不是PChar类型的问题呀??
谢谢了
try
Socket.ReceiveBuf(p[0], Socket.ReceiveLength);
Socket.ReceiveBuf(p[0], Socket.ReceiveLength);//这句又错误
http://www.csdn.net/develop/article/19/19977.shtm
var
Count, i: integer;
begin
//p := nil;
while Socket.ReceiveLength > 0 do
begin
Memo_Log.Lines.Add(Socket.ReceiveText);
Count := SS.Socket.ActiveConnections;
for i := 0 to Count - 1 do
begin
SS.Socket.Connections[i].SendBuf(Memo_Log.Lines[Memo_Log.Lines.Count-1], length(Memo_Log.Lines[Memo_Log.Lines.Count-1]));
end;
end;
end;
如果你的TClientSocket的ClientType是非阻塞式的(ctNonBlocking),
那么就用Socket.ReceiveText接收文本信息,比用Socket.ReceiveBuf安全一些。
同样发送文本信息用Socket.SendText而不是Socket.SendBuf为什么使用ReceiveBuf接收文本信息不安全?
- ReceiveLength返回的值不是精确的
- GetMem(p, lh);使用GetMem为p分配的内存并没有初始化(以0填充),而PChar是以0结尾的,StrPas转化时有可能出现越界(超过p的实际范围)而产生乱码。如果必须使用ReceiveBuf接收文本信息建议用AllocMem代替GetMem,同时保证为p分配的内存大于实际需要的大小,以保证接收到的文本是以0结尾的。