我用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);
……
在上面这个函数中输出的内容为空,请问怎么解决?我哪里写错了,谢谢大家

解决方案 »

  1.   

    原来接收了一次,后面接收不到时我也想到这个问题,所以就把前面接收的屏掉了
    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;
      

  2.   

    没办法,打了半天的回复,服务器一个Time out就全没了.应该是因为在调用Socket.ReceiveText的时候不存在可接收的数据,而使用的又是非阻塞模式,ReceiveText就立即返回空串
      

  3.   

    也不应该呀,TsClientRead这个就是有数据来的时候才触发的事件,中间我又没有读取过
      

  4.   

    按照你的思路把你的程序改进了一下
    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;
      

  5.   

    多谢fangsp 的改进,但这个程序,我主要想接收数据后启用新的线程进行处理,
    也就是说
    Datahexstr:=StrToHexStr(buf);
    Form1.Memo1.Lines.Add(Datahexstr); //显示接收的数据
    这两行要在新的线程里执行