我只做9台客户端,但是有2台同时发送信息,服务器端就只处理一个,弄得客户端的程序死掉,是不是我的服务器端的多线程没有做好啊~~~~
procedure Tnetquery.execute;  //线程
var
   hICMPdll: HMODULE;
   IPOpt:TIPOptionInformation;
   FIPAddress:DWORD;
   pReqData,pRevData:PChar;
   pIPE:PIcmpEchoReply;
   FSize: DWORD;
   MyString:string;
   FTimeOut:DWORD;
   BufferSize:DWORD;
   i:integer;
   // ipstr:string;
   ipstr:array[0..8]of string;
   status:string;
begin
  WSAStartup(2,WSAData);  //初始化网络协议栈
  //************************
  //int WSAStarup(WORD wVersionRequested,LPWSADATA lpWSAData);
  //[参数]
  //wVersionRequested - 要求使用Winsock的最低版本号
  //lpWSAData - Winsock的详细资料
  //[返回值]
  //当函数成功调用时返回0
  //失败时返回非0的值
  //*************************  hICMPdll := LoadLibrary('icmp.dll');
  @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');  //取动态库中的导出函数
  @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
  @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
  hICMP :=IcmpCreateFile;  begin
    ipstr[0]:='192.168.1.2';
    ipstr[1]:='192.168.1.3';
    ipstr[2]:='192.168.1.4';
    ipstr[3]:='192.168.1.5';
    ipstr[4]:='192.168.1.6';
    ipstr[5]:='192.168.1.7';
    ipstr[6]:='192.168.1.8';
    ipstr[7]:='192.168.1.9';
    ipstr[8]:='192.168.1.10';    status:='000000000';
    for i:=0 to  8 do
    begin
      FIPAddress:=inet_addr(pchar(ipstr[i]));
      FSize := 40;
      BufferSize := SizeOf(TICMPEchoReply) + FSize;
      GetMem(pRevData,FSize);
      GetMem(pIPE,BufferSize);
      FillChar(pIPE^, SizeOf(pIPE^), 0);    //出错语句
      pIPE^.Data := pRevData;
      MyString := '-------Hello、World!---------------';
      pReqData := PChar(MyString);
      FillChar(IPOpt, Sizeof(IPOpt), 0);
      IPOpt.TTL := 64;
      FTimeOut := 1000;
      IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),
                    @IPOpt, pIPE, BufferSize, FTimeOut);
      try
        try
        if pReqData^ = pIPE^.Options.OptionsData^ then
        begin
          //StatusShow.Lines.Add(pchar(pchar(ipstr[i]))+ '---'
          //  +IntToStr(pIPE^.DataSize) + '-----' +IntToStr(pIPE^.RTT));
          status:=copy(status,0,i)+'1'+copy(status,i+2,8-i);
        end;
        except
          //showmessage('无法连接');
        end;
      finally
        FreeMem(pRevData);
        FreeMem(pIPE);
      end;
    end; //for    comstatu:=status;
    databag.timer2.enabled:=true;
    fmdesk.edit2.text:=comstatu;
  end;
  WSACleanup();
end;procedure Tdatabag.IdTCPServer1Execute(AThread: TIdPeerThread);
var
 I:integer;
 readstr, scommand:string;
begin
  with athread.Connection do
  begin
    scommand:=readln();
    fmdesk.edit1.text:=fmdesk.edit1.text+'sendID:'+copy(scommand,9,4);
    //******************************************
    if copy(scommand,5,4)='0X01' then
    begin
      writeln('0X11'+inttostr(length(scommand)));
      readstr:=readln();
      if readstr<>'ok' then  //再次检验发送内容的长度
      begin
        fmdesk.edit1.text:=fmdesk.edit1.text+'send data error';
        scommand:=readln();
        if copy(scommand,5,4)='0X01' then
          writeln('0X11'+inttostr(length(scommand))); //检验长度发送
        readstr:=readln();//返回检验的结果
        if readstr<>'ok' then
        begin
          fmdesk.edit1.text:=fmdesk.edit1.text+'error again';
          scommand:='error';
        end;
      end else
      begin
      //*****************************************
      //if copy(scommand,5,4)='0X02' then  //发送网络数据
      //begin
      //  writeln('0X12'+comstatu);
      //  if readln()='ok' then else
      //  scommand:='error';
      //end else
      //begin
        //scommand:='error';
      //end;
      //****************************************
      end;
    end;
    revcommand[commandnum]:=scommand;
    commandnum:=commandnum+1;
    timer1.Enabled:=true;
  end;
end;procedure Tdatabag.Timer2Timer(Sender: TObject);     //处理网络巡查
var
  mythread:Tnetquery;
begin
  timer2.enabled:=false;
  if not mythread.terminated then
  begin
    mythread:=Tnetquery.Create(false);
    //mythread.FreeOnTerminate:=true;
    //mythread.Resume;
  end;
end;