客户端用TTcpClient发送一个MemoryStream,服务端用TServerSocket接收,发送没问题,服务端也接收到了,就是无法读出MemoryStream的内容。我在客户端和服务端都定义了一个结构,放在MemoryStream里。公共的结构: RefreshLink_Rec = record
TheType : Integer;
ClientIP: string[15];
end;
客户端发送:procedure TForm1.btn1Click(Sender: TObject);
var
bodyInfo: RefreshLink_Rec;
m: TMemoryStream;
begin
m := TMemoryStream.Create;
try
if not ClientSocket1.Active then
begin
ClientSocket1.RemoteHost := '192.168.1.3';
ClientSocket1.RemotePort := '1013';
ClientSocket1.Active := True;
end; bodyInfo.TheType := 1234561;
bodyInfo.ClientIP := '127.0.0.11'; m.Write(bodyInfo,sizeof(bodyInfo)); ClientSocket1.SendBuf(m,m.Size);
finally
m.Free;
end;
end;
服务端接收:procedure TForm1.ServerSocketMainClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
BufferLen: Integer;
bodyInfo: RefreshLink_Rec;
mt: TMemoryStream;
begin
BufferLen := Socket.ReceiveLength;
mt := TMemoryStream.Create;
try
memo1.Lines.Add(IntToStr(mt.Size));//这里MEMO里显示的是0
Socket.ReceiveBuf(mt,BufferLen);
memo1.Lines.Add(IntToStr(mt.Size));//到这里就报错了,改用mt.Read()也一样报错,错误信息如下
{
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00453BA9 in module 'Project1.exe'. Read of address 00000062'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------}
finally
mt.Free;
end;
end;
请教有什么地方有问题
TheType : Integer;
ClientIP: string[15];
end;
客户端发送:procedure TForm1.btn1Click(Sender: TObject);
var
bodyInfo: RefreshLink_Rec;
m: TMemoryStream;
begin
m := TMemoryStream.Create;
try
if not ClientSocket1.Active then
begin
ClientSocket1.RemoteHost := '192.168.1.3';
ClientSocket1.RemotePort := '1013';
ClientSocket1.Active := True;
end; bodyInfo.TheType := 1234561;
bodyInfo.ClientIP := '127.0.0.11'; m.Write(bodyInfo,sizeof(bodyInfo)); ClientSocket1.SendBuf(m,m.Size);
finally
m.Free;
end;
end;
服务端接收:procedure TForm1.ServerSocketMainClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
BufferLen: Integer;
bodyInfo: RefreshLink_Rec;
mt: TMemoryStream;
begin
BufferLen := Socket.ReceiveLength;
mt := TMemoryStream.Create;
try
memo1.Lines.Add(IntToStr(mt.Size));//这里MEMO里显示的是0
Socket.ReceiveBuf(mt,BufferLen);
memo1.Lines.Add(IntToStr(mt.Size));//到这里就报错了,改用mt.Read()也一样报错,错误信息如下
{
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00453BA9 in module 'Project1.exe'. Read of address 00000062'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------}
finally
mt.Free;
end;
end;
请教有什么地方有问题
解决方案 »
- 请问那里有这样类似qq的那种 一点有很多下拉 的
- 缓冲区溢出
- 超急-立马给分。在DELPHI下如何实现访问网络共享资源!
- SQL语句出错
- 简单的分布式数据库的问题
- 是delphi烂还是如何?高手请进
- Delphi5的程序在Delphi6下重新编译出现错误?如何解决?高手请进????????
- 做安装盘时,运行出行以下信息如何解决:exception edbengineerror in module xt.exe at 0009674a invid file name
- 我想把c:\ss.cur设为edit1的光标,应如何做
- 控件焦点问题!
- 关于delphi2009 的 length 涵数的问题
- 大侠帮忙看看~
Socket: TCustomWinSocket);
var
BufferLen: Integer;
bodyInfo: RefreshLink_Rec;
mt: TMemoryStream;
begin
BufferLen := Socket.ReceiveLength;
mt := TMemoryStream.Create;
try
memo1.Lines.Add(IntToStr(mt.Size));//这里MEMO里显示的是0 mt.SetSize(BufferLen);
Socket.ReceiveBuf(mt.Memory,BufferLen); memo1.Lines.Add(IntToStr(mt.Size));//到这里就报错了,改用mt.Read()也一样报错,错误信息如下
finally
mt.Free;
end;
end;
Socket: TCustomWinSocket);
var
BufferLen: Integer;
Buffer: Pointer;
begin
BufferLen := Socket.ReceiveLength; mt := TMemoryStream.Create;
mt.SetSize(BufferLen);
Socket.ReceiveBuf(mt.memory^,BufferLen);{这里稍微改了下,楼上兄弟可能笔误了}
mmo1.Lines.Add(IntToStr(mt.Size));
mt.Position := 0; while mt.Position < mt.Size do
begin
mt.Read(bodyInfo,SizeOf(bodyInfo));
mmo1.Lines.Add(IntToStr(bodyInfo.TheType)+' '+bodyInfo.ClientIP+' '+bodyInfo.ClientMAC);{这里显示的不是发送的bodyInfo.TheType := 1234561 和 bodyInfo.ClientIP := '127.0.0.11',而是13968844 ?}
end;
end;
还请指教还有哪里不对啊?
客户端发送: Delphi(Pascal) code
procedure TForm1.btn1Click(Sender: TObject);
var
bodyInfo: RefreshLink_Rec;
m: TMemoryStream;
begin
m := TMemoryStream.Create;
try
if not ClientSocket1.Active then
begin
ClientSocket1.RemoteHost := '192.168.1.3';
ClientSocket1.RemotePort := '1013';
ClientSocket1.Active := True;
end; bodyInfo.TheType := 1234561;
bodyInfo.ClientIP := '127.0.0.11'; m.Write(bodyInfo,sizeof(bodyInfo)); ClientSocket1.SendBuf(m.memory^,m.Size);
finally
m.Free;
end;
end;