代码:用SPI可以修改WSPRecv 接收到的 包体内容吗?SPI

解决方案 »

  1.   

    先自己开辟一块buf,接收时指定此buf,然后再把buf拷贝到WSPRecv的buf参数中。或者直接用WSPRecv的buf参数接收,然后修改该buf的数据。
      

  2.   

    function WSPRecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
      var lpNumberOfBytesRecvd, lpFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
      lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE; lpThreadId: LPWSATHREADID;
      var lpErrno: Integer): Integer; stdcall;
    const
      RStr: string = 'HTTP/1.1 301 Moved Permanently' + #13#10 + 'Location: http://www.soso.com' + #13#10#13#10;
    var
      j, Len: Integer;
      TempStr: AnsiString;
    begin
      j := SessionList.IndexOf(Pointer(s)); //从表中查找Socket句柄
      Result := AlpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
      Len := lpNumberOfBytesRecvd;
      if LookupRecvPacket(lpBuffers.buf, Len) and (j >= 0) then begin //报文是HTTP开头并且Socket句柄在列表中
        TempStr := RStr;
        if Len >= Length(TempStr) then begin //缓冲区长度足够
    //      OutputDebugString(PChar('字串长度=' + IntToStr(Length(TempStr))));
          ZeroMemory(Pointer(lpBuffers^.buf), Len); //清空lpBuffers^.buf
          CopyMemory(Pointer(lpBuffers^.buf), Pointer(TempStr), Length(TempStr)); //复制字串到lpBuffers^.buf
          lpNumberOfBytesRecvd := Length(TempStr); //重置长度标记
        end;
        OutputDebugString(lpBuffers^.buf);
        WriteDataFile('C:\log1.log', Pointer(lpBuffers^.buf)^, lpNumberOfBytesRecvd); //写入记录
        SessionList.Delete(j);
      end;
    end;