我用Socket通信,定义了一个数据类型
const
CMax=10; //客户端最大连接数
type
client_record=record
CHandle: integer; //客户端套接字句柄
CSocket:TCustomWinSocket; //客户端套接字
CName:string; //客户端计算机名称
CAddress:string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end;
Pclient_Record=^client_Record;
……
然后在服务器端接收到数据的事件里//
for i:=0 to sessions do
begin
if session[i].CHandle = Socket.SocketHandle then
begin
Find_Start(session[i]);
end;
end;function Find_Start(CR:client_Record):boolean;
var
P:PClient_Record;
ThreadID:DWord;
begin
ParentHandle:=FindWindowEx(0,0,nil, PChar(Form1.EdtCaption.Text));
if (ParentHandle<>0) and (iWhile <> -1) then
begin
iWhile:=0;
getmem(P,sizeof(P));
P.CHandle:=CR.CHandle;
P.CSocket:=CR.CSocket;
p.CName:=CR.CName;
p.CAddress:=CR.CAddress;
P.CUsed:=CR.CUsed;
CreateThread(nil,0,@Monitor_start,P,0,ThreadID);
CreateThread(nil,0,@ProcTipMessage,P,0,ThreadID);
end;
end;
function Monitor_start(P:Pclient_Record):boolean;stdcall;
var
R:TRect;
Lstr:TStringList;
begin
Form1.Memo1.Lines.Add(P^.CSocket.ReceiveText);
……
在上面这个函数中输出的内容为空,请问怎么解决?我哪里写错了,谢谢大家
const
CMax=10; //客户端最大连接数
type
client_record=record
CHandle: integer; //客户端套接字句柄
CSocket:TCustomWinSocket; //客户端套接字
CName:string; //客户端计算机名称
CAddress:string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end;
Pclient_Record=^client_Record;
……
然后在服务器端接收到数据的事件里//
for i:=0 to sessions do
begin
if session[i].CHandle = Socket.SocketHandle then
begin
Find_Start(session[i]);
end;
end;function Find_Start(CR:client_Record):boolean;
var
P:PClient_Record;
ThreadID:DWord;
begin
ParentHandle:=FindWindowEx(0,0,nil, PChar(Form1.EdtCaption.Text));
if (ParentHandle<>0) and (iWhile <> -1) then
begin
iWhile:=0;
getmem(P,sizeof(P));
P.CHandle:=CR.CHandle;
P.CSocket:=CR.CSocket;
p.CName:=CR.CName;
p.CAddress:=CR.CAddress;
P.CUsed:=CR.CUsed;
CreateThread(nil,0,@Monitor_start,P,0,ThreadID);
CreateThread(nil,0,@ProcTipMessage,P,0,ThreadID);
end;
end;
function Monitor_start(P:Pclient_Record):boolean;stdcall;
var
R:TRect;
Lstr:TStringList;
begin
Form1.Memo1.Lines.Add(P^.CSocket.ReceiveText);
……
在上面这个函数中输出的内容为空,请问怎么解决?我哪里写错了,谢谢大家
procedure TForm1.TsClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
i:integer;
begin
//将从客户端读取的信息添加到Memo1中
// Memo1.Lines.Add(Socket.ReceiveText);
//取得匹配的客户端
for i:=0 to sessions do
begin
if session[i].CHandle = Socket.SocketHandle then
begin
Find_Start(session[i]);
end;
end;
end;
const
CMax=10;
type
client_record = Record
CHandle: integer;
CSocket:TCustomWinSocket;
CName:string;
CAddress:string;
CUsed: boolean; //是否被使用
end;
public
session:array[0..CMax] of client_record;
sessions:integer;function StrToHexStr(const S:string):string;
var
I:Integer;
begin
for I:=1 to Length(S) do
begin
if I=1 then
Result:=IntToHex(Ord(S[1]),2)
else Result:=Result+IntToHex(Ord(S[I]),2);
end;
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,n,k:integer;
sAConnections:TConnectionsParam;
begin
connectok:=true;
j:=-1;
for i:=0 to sessions do
begin
if not session[i].CUsed then
begin
session[i].CHandle:=socket.SocketHandle;
session[i].CSocket:=socket;
session[i].CName:=socket.RemoteHost;
session[i].CAddress:=socket.RemoteAddress;
session[i].CUsed:=true;
sAConnections.ConnectionsNO:=inttostr(i);
sAConnections.ConnectionsIP:=session[i].CAddress;
sAConnections.ConnectionsHost:=session[i].CName;
sAConnections.ConnectionsIs:=true;
Break;
end;
j:=i;
end;
if j=sessions then
begin
inc(sessions);
n:=sessions;
session[n].CHandle:=socket.SocketHandle;
session[n].CSocket:=socket;
session[n].CName:=socket.RemoteHost;
session[n].CAddress:=socket.RemoteAddress;
session[n].CUsed:=True; sAConnections.ConnectionsNO:=inttostr(n);
sAConnections.ConnectionsIP:=session[n].CAddress;
sAConnections.ConnectionsHost:=session[n].CName;
sAConnections.ConnectionsIs:=true;
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf:string;
Datahexstr:string;
begin
buf:='';
Datahexstr:='';
buf:=Socket.ReceiveText ;
Datahexstr:=StrToHexStr(buf);
Form1.Memo1.Lines.Add(Datahexstr); //显示接收的数据
end;
也就是说
Datahexstr:=StrToHexStr(buf);
Form1.Memo1.Lines.Add(Datahexstr); //显示接收的数据
这两行要在新的线程里执行