delphi LSP(SPI) 如何在SPI服务中进行URL地址重定向

wowlancelot 2013-08-15 02:52:16
WSPRecv收到数据包后修改lpBuffers^.buf的内容,但没有效果,求解
以下为WSPRecv代码




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 Redirect_String: AnsiString = // 重定向字符串
'HTTP/1.1 301 Moved Permanently' + #13#10 + 'Location: ' + 'http://www.qq.com' + #0;
var i, j, n: Integer;
tmpStr: string;
begin
tmpStr := IntToHex(s, 8);
i := SessionList.IndexOf(tmpStr);//从表中查找Socket句柄
if i >= 0 then begin
SessionList.Delete(i);//删除记录
lpBuffers^.buf:=PChar(Redirect_String);//修改内容
end;
Result := NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
end;


...全文
1214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pc248 2015-03-29
  • 打赏
  • 举报
回复
Result := AlpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno); 请教一下这个是怎么定义出来的,在WSPRecv 里不应该产生回调了么?
pathletboy 2014-05-17
  • 打赏
  • 举报
回复
要先调用原接收函数把数据收下后再改。
koal1122 2014-05-16
  • 打赏
  • 举报
回复
sololie 2013-08-23
  • 打赏
  • 举报
回复
good good study, day day up
wowlancelot 2013-08-23
  • 打赏
  • 举报
回复
自己研究出来了,上面的代码就是解决方案了 改动下这个就好了
const RStr: string = 'HTTP/1.1 301 Moved Permanently' + #13#10 + 'Location: http://www.soso.com' + #13#10#13#10;
幽儿wo 2013-08-20
  • 打赏
  • 举报
回复
我也遇到同样的问题,求解
wowlancelot 2013-08-20
  • 打赏
  • 举报
回复

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' + #0;
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;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧