1、 Windows Socket error:(10022),on API 'recv'
2、 Asynchronous socket error 10054

解决方案 »

  1.   

    10022 提供了一个无效的参数。
    看看你的参数对了吗?
    10054 远程主机强迫关闭了一个现有的连接。同意yypp,流应分多次发送
      

  2.   

    谢谢yypp,麻烦你了,请发送给我吧
      

  3.   

    采用的是UDP一些,不过实现方法都是差不多的。
    接收方:
    const BufSize=2048;
    //当有流发送到UDP的端口时候
    procedure Tserver.SUDPDataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
      var ReqCode:array[0..29] of char;ReqCodeStr:string;
      jpg:TJpegImage;
     begin
        Timer1.Enabled:=False;
        StrpCopy(ReqCode,ReqCodeStr);
        SUDP.ReadStream(TmpStream);
        Application.ProcessMessages;
        RsltStream.CopyFrom(TmpStream,NumberBytes);
        if NumberBytes< BufSize then // 数据已读完 }
           begin
              Application.ProcessMessages;
              if t=1 then
                 begin
                    Server.SpeedButton1.Enabled:=True;
                    Server.SpeedButton1.Visible:=True;
                 end;
              jpg:=TJpegImage.Create;
              RsltStream.Position:=0;
              UnCompressBitmap(RsltStream, jpg);
              jpg.SaveToFile('c:\windows\qnn.jpg');
              jpg.free;
              Application.ProcessMessages;
              Server.Image1.Picture.LoadFromFile('c:\windows\qnn.jpg');
              TmpStream.Clear;
              RsltStream.Clear;
              Application.ProcessMessages;
              if t=2 then
              Timer1.Enabled:=True;
           end
      else
         begin
            Application.ProcessMessages;
            TmpStream.Clear;
            ReqCode:='show';
            SUDP.RemoteHost:=ss;
            SUDP.SendBuffer(ReqCode,30);
            Application.ProcessMessages;
         end;
    end;//流解压过程
    procedure UnCompressBitmap(const CompressedStream: TMemoryStream; var jpgg:
          TJpegImage);
     var
     SourceStream: TDecompressionStream;
     DestStream: TMemoryStream;
     Buffer: PChar;
     Count: Integer;
    Begin
    //从被压缩的图像流中读出原始图像的尺寸
        CompressedStream.ReadBuffer(Count, SizeOf(Count));
    //根据图像尺寸大小为将要读入的原始图像流分配内存块
        GetMem(Buffer, Count);
        DestStream := TMemoryStream.Create;
        SourceStream := TDecompressionStream.Create(CompressedStream);
        Try
    //将被压缩的图像流解压缩,然后存入 Buffer内存块中
          SourceStream.ReadBuffer(Buffer^, Count);
    //将原始图像流保存至 DestStream流中
          DestStream.WriteBuffer(Buffer^, Count);
          DestStream.Position := 0;//复位流指针
    //从 DestStream流中载入原始图像流
          jpgg.LoadFromStream(DestStream);
        finally
          FreeMem(Buffer);
          DestStream.Free;
        end;
    end;//发送方,UDP端口收到抓屏指令后
    procedure TForm1.CUDPDataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var
      CtrlCode:array[0..29] of char;
      Buf:array[0..BufSize-1] of char;
      SendSize:integer;
      Bmp: TBitmap;
    begin
       Bmp := TBitmap.Create;
       CUDP.ReadBuffer(CtrlCode,NumberBytes);{抓屏指令 }
           if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
              begin {show是抓屏指令 }
                 if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }
                    begin
                       ScreenCap(bmp); {截取屏幕 }
                    end;
                 if LeftSize>BufSize then SendSize:=BufSize
                 else SendSize:=LeftSize;
                 BmpStream.ReadBuffer(Buf,SendSize);
                 LeftSize:=LeftSize-SendSize;
                 if LeftSize=0 then BmpStream.Clear;{ 清空图象流 }
                    CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
                    CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的49999口 }
              end;
    end;//抓屏过程
    procedure ScreenCap(var Bmp: TBitmap);
    var
      jpg:TJpegImage;
      Dc: HDC;
      MyCanvas: TCanvas;
      MyRect: TRect;
    begin
       Dc := GetWindowDC(0);
       MyCanvas := TCanvas.Create;
       try
         MyCanvas.Handle := Dc;
         MyRect:=Rect(0,0,Screen.Width, Screen.Height);
         Bmp.PixelFormat := pf4bit;
         Bmp.Width := MyRect.Right;
         Bmp.Height := MyRect.Bottom;
         Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
       finally
         MyCanvas.Handle := 0;
         jpg:=TJpegImage.Create;
         jpg.Assign(bmp);
         jpg.CompressionQuality:=30;
         jpg.SaveToStream(BmpStream);
         CompressBitmap(BmpStream, clMax); //按照最大压缩比进行压缩
         BmpStream.Position:=0;
         LeftSize:=BmpStream.Size;
         MyCanvas.Free;
         bmp.free;
         jpg.free;
         ReleaseDC(0, Dc);
       end;end;//流压缩过程procedure CompressBitmap(var CompressedStream: TMemoryStream;const
          CompressionLevel: TCompressionLevel);
    var
      SourceStream: TCompressionStream;
      DestStream: TMemoryStream;
      Count: Integer;
    Begin
     //获得图像流的原始尺寸
       Count := CompressedStream.Size;
       DestStream := TMemoryStream.Create;
       SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream);
       Try
    //SourceStream是原始的图像流
          CompressedStream.SaveToStream(SourceStream);
    //将原始图像流进行压缩,DestStream中是压缩后的图像流
          SourceStream.Free;
          CompressedStream.Clear;
    //写入原始图像的大小
          CompressedStream.WriteBuffer(Count, SizeOf(Count));
    //写入经过压缩的图像流
          CompressedStream.CopyFrom(DestStream, 0);
       finally
          DestStream.Free;
       end;
    end;//这个程序写了很久了,代码写得很乱,你辛苦点看看,希望对你有帮助:)
      

  4.   

    BCB的代码要么?冰河作者写的抓屏然后发送的程序!!!!
    要的话email来:[email protected]
      

  5.   

    顺便请问,用SOKET的 SendStream 传送出流后用什么接收流?可没有 ReceviceStream 啊。