// 镳钼屦屐 铗忮? if (Pos('200 OK', LResponseStr) <> 0) then begin Result := True; end;
// if LNet.IOHandler.CheckForDataOnSource(1000) then // begin // LResponseStr := LNet.IOHandler.ReadString(LNet.IOHandler.InputBuffer.Size); // // 礤觐蝾瘥?痤篁屦? 镱瘀?扈 铗忮? // if LNet.IOHandler.CheckForDataOnSource(1000) then // begin // LResponseStr := LNet.IOHandler.ReadString(LNet.IOHandler.InputBuffer.Size); // end; // end; end;
// 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[AddPortMapping] ' + LResponseStr); end;
// 镳钼屦屐 铗忮? // if (LResponseStr <> '') then // begin // LXml := CreateXMLDoc; // LXml.LoadFromXML(LResponseStr); // LNNode := LXml.DocumentElement.SelectNode('//u:AddPortMappingResponse'); // if Assigned(LNNode) then // begin // Result := True; // end; // end; except on E: Exception do begin // 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[AddPortMapping] ' + E.Message); end; end; end; finally FreeAndNil(LNet); FreeAndNil(LSendData); end; end;
// 镳钼屦屐 铗忮? if (Pos('200 OK', LResponseStr) <> 0) then begin //Result := True; end;
// 镱塍鬣屐 铗忮? // if LNet.IOHandler.CheckForDataOnSource(1000) then // begin // LResponseStr := LNet.IOHandler.ReadString(LNet.IOHandler.InputBuffer.Size); // // 礤觐蝾瘥?痤篁屦? 镱瘀?扈 铗忮? // if LNet.IOHandler.CheckForDataOnSource(1000) then // begin // LResponseStr := LNet.IOHandler.ReadString(LNet.IOHandler.InputBuffer.Size); // end; // end; end;
// 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[DeletePortMapping] ' + LResponseStr); end; except on E: Exception do begin // 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[DeletePortMapping] ' + E.Message); end; end; end; finally FreeAndNil(LNet); FreeAndNil(LSendData); end; end;
// 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[Discover] ' + 'DeviceIP: ' + FDeviceIP); FOnDebug('[Discover] ' + 'DevicePort: ' + IntToStr(FDevicePort)); end;
// 玎镳铖 羿殡?铒桉囗? LResponseStr := LHttp.Get(LUri.URI); if (LResponseStr <> '') then begin // 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[Discover] ' + LResponseStr); end;
for i := 0 to LNodeList.Count - 1 do begin LNService := LNodeList[i]; LNServiceType := LNService.SelectNode('serviceType'); if Assigned(LNServiceType) and (LNServiceType.ChildNodes[0].NodeValue = WAN_IP_CONN_SERVICE_TYPE) then begin LNControlURL := LNService.SelectNode('controlURL'); if Assigned(LNControlURL) then begin FDeviceControlURL := LNControlURL.ChildNodes[0].NodeValue; // 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[Discover] ' + 'DeviceControlURL: ' + FDeviceControlURL); end; Break; end; end; end; end; end; end; until LPeerPort = 0; finally FreeAndNil(LNet); FreeAndNil(LHttp); FreeAndNil(LUri); end; end;
function TuPnP.GetDiscovered: Boolean; begin Result := (FDeviceIP <> ''); end;
function TuPnP.GetExternalIP: String; var LNet: TIdTCPClient; LHeaderStr: String; LResponseStr: String; //LUri: TIdURI; LSendData: TStringStream; LXml: OXmlPDOM.IXMLDocument; LNNode: PXMLNode; begin Result := FExternalIP;
if (Result = '') then begin try LNet := TIdTCPClient.Create(Self); //LUri := TIdURI.Create(''); LSendData := TStringStream.Create('');
// 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[GetExternalIP] ' + LHeaderStr + LSendData.DataString); end;
try // 铗豚潢? // if Assigned(FOnDebug) then // begin // FOnDebug('[GetExternalIP] ' + 'URI: ' + LUri.URI); // end;
LNet.Host := FDeviceIP; LNet.Port := FDevicePort; LNet.Connect; if LNet.Connected then begin // 铗覃豚屐 玎镳铖 LNet.IOHandler.WriteLn(LHeaderStr + LSendData.DataString, IndyTextEncoding_UTF8);
// 镱塍鬣屐 铗忮? if LNet.IOHandler.CheckForDataOnSource(1000 * 10) then begin LResponseStr := LNet.IOHandler.ReadString(LNet.IOHandler.InputBuffer.Size); // 礤觐蝾瘥?痤篁屦? 镱瘀?扈 铗忮? if LNet.IOHandler.CheckForDataOnSource(1000 * 10) then begin LResponseStr := LResponseStr + LNet.IOHandler.ReadString(LNet.IOHandler.InputBuffer.Size); end; end; end;
// 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[GetExternalIP] ' + LResponseStr); end;
if (LResponseStr <> '') then begin // 箐嚯屙桢 HTTP 玎泐腩怅? LResponseStr := Copy(LResponseStr, Pos(EOL+EOL, LResponseStr) + Length(EOL+EOL), Length(LResponseStr));
LXml := CreateXMLDoc; LXml.LoadFromXML(LResponseStr); LNNode := LXml.DocumentElement.SelectNode('//NewExternalIPAddress'); if Assigned(LNNode) then begin Result := LNNode.ChildNodes[0].NodeValue; FExternalIP := Result; end; end; except on E: Exception do begin // 铗豚潢? if Assigned(FOnDebug) then begin FOnDebug('[GetExternalIP] ' + E.Message); end; end; end; finally FreeAndNil(LNet); //FreeAndNil(LUri); FreeAndNil(LSendData); end; end; end;
uPnP := TuPnP.Create(self); uPnP.Discover; if uPnP.Discovered then begin showmessage(uPnP.GetExternalIP); end; if uPnP.AddPortMapping(1234) then begin showmessage('映射完成'); end; uPnP.DeletePortMapping(1234); uPnP.Free;
----------------------------------------------
按照你写的demo运行报错 uPnP := TuPnP.Create(self); uPnP.Discover; if uPnP.Discovered then begin showmessage(uPnP.GetExternalIP); end; if uPnP.AddPortMapping(1234) then begin showmessage('映射完成'); end; uPnP.DeletePortMapping(1234);//这句产生异常 uPnP.Free;
----------------------------------------------
-