本帖最后由 unearth 于 2010-11-18 05:41:06 编辑

解决方案 »

  1.   


      if WSAASyncSelect(ServerSocket, glDialog , WM_ASYNCSELECT, FD_ACCEPT or FD_READ or FD_CLOSE) <> 0 then
      begin
        closesocket(ServerSocket);
        result := false;
        Exit;
      end;
     
     设置成非阻塞模式
      

  2.   

    自己使用api实现,应该会比较稳定啊
    可能是上面说的模式不对
      

  3.   


    bBolck:=0;
    改为
    bBolck:=1;
      

  4.   

    oh~,我的神,为什么我搞不定它?
    将bBlock:=1; //var
      FD: TFDSet;
      TimeVal: TTimeVal;
      {其他代码不变}
      while True do
      begin
        FD_ZERO(FD);  
        FD_SET(SocketServer, FD);
        TimeVal.tv_sec := 0;
        TimeVal.tv_usec := 500;
        if (select(0, @FD, nil, nil, @TimeVal) > 0) then {哎,利用select对socket进行超时检查。早知道把文章看完了。在循环时,貌似在对Form的WM_Close没有响应,估计又堵了。}
        begin
          AddrSize := SizeOf(AddrClient);
          ClientSocket := accept(SocketServer, @AddrClient, @AddrSize);
          if ClientSocket <> INVALID_SOCKET then
            TSocketRead.Create(ClientSocket, mmoLog)
          else
            closesocket(ClientSocket);
          Application.ProcessMessages;
        end;
      end;
      

  5.   


      bBolck:=1;
      ioctlsocket(SocketServer,FIONBIO,bBolck);
    有这么写socket的吗?你去看看scktcomp.pas
      

  6.   

    scktcomp.pas  看得我脑袋好大呀!!