分类 分享 下的文章

Ping包的DNS查询代码For Delphi

抓包抓的是Ping包的查询不是Nslookup所以内容有点少

Type
  PDNS_HDR = ^DNS_HDR;
  DNS_HDR = Record
    id    :Word; //ID编号有本地指定 服务器 返回时也带有此ID
    tag   :Word;
    numq  :Word;
    numa  :Word;
    numa1 :Word;
    numa2 :Word;
  End;

  PDNS_QER = ^DNS_QER;
  DNS_QER = Record
    utype   :Word;
    classes :Word;
  End;

  TIPAddr = Array [0..3] Of Byte;

Const
  BUF_SIZE = 1024;
  SRV_PORT = 53;
  
  
Function QueryDNS(szHost:PAnsiChar; Server:PAnsiChar):TIPAddr;
Label OnExit;
Var
  dnshdr :PDNS_HDR;
  dnsqer :PDNS_QER;
  Buffer :Array [0..BUF_SIZE-1] Of Byte;
  nSocket:TSocket;
  SerAddr:TSockAddrIn;
  I      :Integer;
  nRet   :Integer;
  dwLen  :Integer;
begin
  ZeroMemory(@Result, SizeOf(TIPAddr));
  nSocket := socket(AF_INET, SOCK_DGRAM, 0);
  If nSocket = INVALID_SOCKET then  Exit;
  SetSocketIoOutTime(nSocket, 8000);
  SerAddr.sin_family        := AF_INET;
  SerAddr.sin_port          := Htons(SRV_PORT);
  SerAddr.sin_addr.s_addr   := Inet_Addr(Server);
  if SerAddr.sin_addr.s_addr = SOCKET_ERROR then Goto OnExit;
  ZeroMemory(@Buffer, BUF_SIZE);
  Randomize;
  dnshdr       := @Buffer;
  dnshdr^.id   := Random(65534);  //随机个ID
  dnshdr^.tag  := htons($0100);
  dnshdr^.numq := htons(1);
  dnshdr^.numa := 0;
  lstrcpyA(@Buffer[SizeOf(DNS_HDR) + 1], szHost);
  I           := SizeOf(DNS_HDR) + 1;
  dwLen       := 0;
  While dwLen < lstrlenA(szHost)-2 Do
  begin
    if Buffer[I + dwLen] = 0 then Break;
    If AnsiChar(Buffer[I + dwLen]) = '.' Then
    begin
      Buffer[I - 1] := dwLen;
      Inc(I, dwLen + 1);
      dwLen := 0;
    end Else
    begin
      Inc(dwLen);
    end;
  end;
  Buffer[I - 1]   := dwLen;
  dnsqer          := PDNS_QER(@Buffer[SizeOf(DNS_HDR) + 3 + lstrlenA(szHost) - 1]);
  dnsqer^.utype   := htons(1);
  dnsqer^.classes := htons(1);
  sendto(nSocket, Buffer, SizeOf(DNS_HDR) + SizeOf(DNS_QER) + lstrlenA(szHost) + 2, 0, SerAddr, SizeOf(TSockAddrIn));
  I    := SizeOf(TSockAddrIn);
  ZeroMemory(@Buffer, BUF_SIZE);
  nRet := recvfrom(nSocket, Buffer, BUF_SIZE, 0, SerAddr, I);
  if dnshdr.numa = 0 then //这里=0是不存在的域名
  begin
    Result[0] := 0;
    Result[1] := 0;
    Result[2] := 0;
    Result[3] := 0;
    Goto OnExit;
  End Else
  begin
    dwLen     := nRet - 4;
    Result[0] := Buffer[dwLen];
    Result[1] := Buffer[dwLen+1];
    Result[2] := Buffer[dwLen+2];
    Result[3] := Buffer[dwLen+3];
  end;

  OnExit :
  closesocket(nSocket);
end;


Games for Windows LIVE游戏运行没反应或者xlive安装错误代码0x800b0003的解决

先卸载原有的games live

然后下载在线安装



http://download.gfwl.xboxlive.com/content/gfwl-public/redists/production/gfwlivesetup.exe



如果安装出错提示 0x800b0003

点击 logs按钮查看日志



然后找Download folder 后面的路径

然后进到这个文件夹里 进之前不要关闭live的安装器

进去后有3个MSI文件 复制出来

然后关掉live安装器

着三个文件依次安装就行了

PHP4Delphi 对PHP5.4.X支持的尝试修复

<p>

&nbsp; &nbsp;
PHP5.3.X的话 Delphi盒子论坛有人做了修改

</p>
<p>

&nbsp; &nbsp;
我是在他那个的基础上做修改的

</p>
<p>

&nbsp; &nbsp;
如果不是最近工程需求真不会去看这个代码..

</p>
<p>

&nbsp; &nbsp;
PHP5.4 把之前的php_body_write 修改成了&nbsp;php_output_write

</p>
<p>

&nbsp; &nbsp;
做向上升级兼容的话

</p>
<p>

<br />

</p>
<p>

&nbsp; &nbsp;
ZEND_BUILD_TS&nbsp;线程安全这里是一处要改的

</p>
<p>

&nbsp; &nbsp;
ZEND_MODULE_BUILD_ID 编译ID是一处

</p>
<p>

&nbsp; &nbsp;
ZEND_BUILD_SYSTEM 编译环境是一处{这个是指定是用VC6,9,11编译的}

</p>
<p>

&nbsp; &nbsp;
其他代码的话具体要看着改动了

</p>
<p>

&nbsp; &nbsp;
目前我测试PHP4Delphi的代码里至少需要有二十多个API需要做向上升级兼容

</p>
<p>

&nbsp; &nbsp;
比如 php_body_write&nbsp;需要修改成这样.. 貌似5.5.x 不支持xp跟2k3系统所以我暂时不会去看

</p>

{$IFDEF PHP540}
  php_output_write(Memory, Size, TSRMLS_DC);
{$ELSE}
  php_body_write(Memory, Size, TSRMLS_DC);
{$ENDIF}

<p>

<br />

</p>
<p>

&nbsp; &nbsp;
至于完整的Fix版等手上工程忙完了再改个完整的放出来

</p>
<p>

&nbsp; &nbsp;
下图是我DeBug时的输出....

</p>
<p>

&nbsp; &nbsp;
数了下二十多个...

</p>
<p>

<br />

</p>
<p>

<br />

</p>
<p>

<a href="http://bcs.duapp.com/flandre/Blog/20140511/无标题.jpg"><img src="http://bcs.duapp.com/flandre/Blog/20140511/无标题.jpg" alt="无标题.jpg" /></a>

</p>