- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我让自己的单元使用 winsocket 从网络服务器获取 POST 请求。
这是我的单位:
unit uGetPost;
interface
uses
Winsock,
SysUtils,
Windows;
function GetPost(CompleteURL, PostData : String; var Results : String ; Port: Integer = 80) : Integer;
implementation
procedure RemoveCRLFFromEndAndBeginning (var s : String);
var
i : Integer;
begin
i := Length(s);
while (s[i] = #10) or (s[i] = #13) do begin
SetLength (s, i - 1);
dec (i);
end;
i := 1;
while (s[i] = #10) or (s[i] = #13) do begin
s := Copy (s, 2, Length(s));
inc (i);
end;
end;
function GetIpFromDns(HostName: string): string;
type
tAddr = array[0..100] of PInAddr;
pAddr = ^tAddr;
var
I: Integer;
WSA: TWSAData;
PHE: PHostEnt;
P: pAddr;
begin
Result := HostName;
WSAStartUp($101, WSA);
try
PHE := GetHostByName(pChar(HostName));
if (PHE <> nil) then
begin
P := pAddr(PHE^.h_addr_list);
I := 0;
while (P^[i] <> nil) do
begin
Result := (inet_nToa(P^[i]^));
Inc(I);
end;
end;
except
end;
WSACleanUp;
end;
function Parsing(Char, Str: string; Count: Integer): string;
var
i : Integer;
strResult : string;
begin
if Str[Length(Str)] <> Char then
Str := Str + Char;
for i := 1 to Count do
begin
strResult := Copy(Str, 0, Pos(Char, Str) - 1);
Str := Copy(Str, Pos(Char, Str) + 1, Length(Str));
end;
Result := strResult;
end;
function GetPost(CompleteURL, PostData : String; var Results : String ; Port: Integer = 80) : Integer;
// 1 = Complete Success
// 2 = No Content (Length found) or wrong GET/POST
// 3 = Host found but no php file
// 4 = Host not found (Total FAIL!);
var
WSA: TWSAData;
Sock: TSocket;
Addr: TSockAddrIn;
SendBuffer: String;
ReceiveBuffer: array[0..4096] of Char;
ReceivedBytes: Integer;
DNS, RemoteFilePath, FileName: string;
i: integer;
SentBytes: Integer;
ContentLength : Integer;
begin
result := 4;
DNS := Copy(CompleteURL, Pos('http://', CompleteURL) + 7, Length(CompleteURL));
RemoteFilePath := Copy(DNS, Pos('/', DNS), Length(DNS));
DNS := Copy(DNS, 1, Pos('/', DNS) - 1);
i := Length(RemoteFilePath);
while (RemoteFilePath[i] <> '/') do
begin
FileName := RemoteFilePath[i] + FileName;
Dec(i);
end;
WSAStartup($101, WSA);
Sock := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
if (Port < 1) or (Port > 65535) then Port := 80;
Addr.sin_port := htons(Port);
Addr.sin_addr.S_addr := inet_addr(PChar(GetIPfromDNS(PChar(DNS))));
if Connect(Sock, Addr, sizeof(Addr)) = 0 then begin
result := 3;
SendBuffer := 'POST ' + RemoteFilePath + ' HTTP/1.1' + #13#10 +
'Host: ' + DNS + #13#10 +
'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0' + #13#10 +
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10 +
'Accept-Language: en-US,en;q=0.5' + #13#10 +
'Accept-Encoding: gzip, deflate' + #13#10 +
'Connection: close' + #13#10 +
'Cache-Control: max-age=0' + #13#10 +
'Content-Type: application/x-www-form-urlencoded' + #13#10 +
'Content-Length: ' + inttostr(Length(PostData)) + #13#10#13#10 +
PostData;
repeat
SentBytes := Send(Sock, SendBuffer[1 + SentBytes], Length(SendBuffer) - SentBytes, 0);
until SentBytes >= Length(SendBuffer);
repeat
ZeroMemory(@ReceiveBuffer, Sizeof(ReceiveBuffer));
ReceivedBytes := Recv(Sock, ReceiveBuffer, Sizeof(ReceiveBuffer), 0);
if ReceivedBytes > 0 then begin
Results := Results + ReceiveBuffer;
end;
until (ReceivedBytes <= 0);
CloseSocket(Sock);
end;
WSACleanup();
if Copy (Results, 10, 6) = '200 OK' then begin
result := 2;
if Pos ('Content-Length: ', Results) <> 0 then begin
i := 1;
while Parsing(#13, Results, i) <> '' do begin
if Pos ('Content-Length: ' , Parsing(#13, Results, i)) <> 0 then begin
ContentLength := strtoint (Copy(Parsing(#13, Results, i), 18, Length (Results)));
results := Copy (results,Length(results) - ContentLength + 1, ContentLength);
break;
end;
inc (i);
end;
if ContentLength <> 0 then begin
result := 1;
RemoveCRLFFromEndandBeginning (results);
end else begin
results := '';
end;
end;
end;
end;
end.
我在 VCL 应用程序中运行 GetPost 函数,如下所示:
var
Res : String;
begin
GetPost ('http://guest1320958.studio2.coderun.com/PHPTest/', 'GET=VERSION', Res);
ShowMessage (Res);
end;
结果如下:
HTTP/1.1 400 Bad Request Content-Type: text/html Date: Fri, 26 Oct 2012 18:56:03 GMT Connection: close Content-Length: 35
Bad Request (Invalid Verb)
如果我在这样的控制台应用程序中运行 SAME 函数:
program Project2;
{$APPTYPE CONSOLE}
uses
uGetPost;
var
Res : String;
begin
GetPost ('http://guest1320958.studio2.coderun.com/PHPTest/', 'GET=VERSION', Res);
writeln (Res);
readln;
end.
它工作得很好。
我的 PHP 代码是这样的:
<?php
if (isset($_POST["GET"])) {
$funcName = $_POST["GET"];
switch($funcName) {
case "VERSION":
echo "1.0";
break;
case "SOMETHINGELSE":
echo "...";
break;
case "ANDSOSON":
echo "...";
}
}
?>
我使用 www.coderun.com测试我的 php。
为什么它在 VLC 中不起作用?顺便说一句:如果您像这样在 VCL 的线程中运行函数 GetPost:
function MyThread ( p : pointer ) : Integer;stdcall;
var
Res : String;
begin
GetPost ('http://guest1320958.studio2.coderun.com/PHPTest/', 'GET=VERSION', Res);
MessageBoxA (0, pchar(Res), '', 0);
end;
procedure StartGetPost;
var
Dummy : DWORD;
begin
CreateThread(NIL,0, @MyThread, NIL,0, Dummy);
end;
...它突然工作...
这是为什么呢?可以请有人帮助我吗?谢谢。
编辑:以下是 wireshark 的结果: http://dl.dropbox.com/u/349314/transfer.pcapng
编辑:看起来实际传输 header 有问题:/
最佳答案
Wireshark 捕获显示,两次尝试之间的主要区别是 GUI 版本在 HTTP 数据中有一个额外的空字符。也就是说,在第一行 POST/PHPWebSite/HTTP/1.1
之前,有一个零字符。这解释了为什么服务器提示无效动词。
失败与在控制台或 GUI 模式下运行无关。相反,问题在于您在以下循环中使用了初始化变量:
repeat
SentBytes := Send(Sock, SendBuffer[1 + SentBytes], Length(SendBuffer) - SentBytes, 0);
until SentBytes >= Length(SendBuffer);
您还没有设置SentBytes
,但是您使用它来索引到SendBuffer
。在循环之前将其初始化为零。
编译器应该就未初始化的变量警告您。永远不要忽略来自编译器的消息,即使它“只是”提示或警告。
在 VCL 线程中,该局部变量显然占用了先前保存非零值(可能是 -1)的内存。在其他情况下,它显然得到值 0,并且您的代码似乎按预期工作。这就是所谓的未定义行为。
关于php - Delphi 代码在控制台中有效,但在 VLC 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092908/
我希望能够以不显眼的方式在 vlc 中查看我的播放列表。目前它看起来像这样: 我的愿望恰恰相反 - 让实际视频播放占据屏幕的大部分,并将播放列表不显眼地放在一边(实际上,除了 this bug 之外,
我目前有一个 Android 应用程序,它正在从相机捕获视频并通过 RTP 流式传输。我不使用 RTSP。 我创建了一个描述 RTP 提要的 SDP 文件。我可以在 Quicktime 7 中打开 S
我在互联网上搜索过这个,但似乎找不到任何东西。我知道有一些热键可以快退几秒钟,我知道有一些热键可以在 VLC 媒体播放器中暂停和播放音频/视频。但是,我使用单个脚踏板进行转录,并且基本上需要它来完成这
我在 C# Windows 表单应用程序中使用 vlc 插件。它适用于所有媒体类型,但不能通过插件播放 YouTube 视频,也可以在主播放器本身中播放。我正在使用以下代码: axVLCPlu
我正在使用 VLC 的命令行选项 --http-user-agent ,但它似乎不起作用。 我的命令是 $ vlc --http-user-agent 'FooBar/1.2.3' 'http://w
在 Linux 中从命令行启动 VLC 媒体播放器有哪些不同的方式? 很难找到这方面的任何信息。这是我迄今为止发现的: vlc - 启动 VLC 媒体播放器 cvlc - 在没有界面的情况下启动 VL
我正在尝试用 java 制作一个简单的 rtsp 流媒体服务器。服务器能够将视频正确地流式传输到自定义的写入播放器。 问题是我无法在 vlc 媒体播放器中播放相同的流。当我启动 vlc 媒体播放器并输
目标 确认 VLC 可以播放本地给定 SDP 文件中的流。 根据证词,这似乎是可能的: Playing RTP using VLC - Stack Overflow How to send SDP o
我正在编写一个简单的 Python 脚本,它应该做一些事情,然后播放一个视频文件,然后再做一些其他事情。 我被迫在装有 Python 3.2.3 和 VLC 的 Windows XP 机器上播放我的视
假设我有一个 RTSP 网址 (rtsp://192.168.0.17/mpeg4)。现场摄像机安装在中继现场视频的机器上。我正在使用 vlc 播放器对其进行流式传输,并将其保存在某个位置的 mp4
我找到了一种在 VLC 3.0.8 上正确显示来自 RTSP 摄像机的流马赛克的方法,并想分享解决方案: 将以下内容写入文件 # Comment the following line if you
我想用 vlc 流式传输 ts 编码的文件。该文件有多个音轨和多个字幕轨道。 是否可以流式传输以便在接收端的播放器中用户可以选择音轨和字幕轨道,如果可以,我该怎么做? 流是通过 vlm 脚本设置的,如
我有一个非常高质量的 RTSP 提要进入 Windows 服务器。我正在尝试使用 VLC 将其重新流式传输为 Http Live Streaming。 有谁知道是否可以通过 VLC 的图形用户界面而不
我正在尝试编写一个小应用程序,重复动态播放单个电影文件。我用 Python 编写的,使用 these VLC-Python 绑定(bind) 我想说,这不会那么难,即使非常稀疏的文档,我也可以全屏播放
我希望有人可以帮助解决 Python 绑定(bind)输出问题(使用 vlc.py) 我有一个使用 vlc.py 的基本测试脚本,它运行但不播放视频。 import vlc def setup_pla
可以在 Cubox 上安装 vlc 和 vlc 的 web 插件? 哪个版本的 Linux 更好,您推荐? Here我已经看到可以重新编译arm架构的源代码,但是可以在cubox上使用vlc而不需要重
我正在使用vlcj捕获Java程序中的屏幕。因此,我使用以下代码: public static void main(final String[] args) { NativeL
我有一个家庭影院设置,光束刚刚太宽,我希望视频能进来一点。我真的很惊讶没有缩小,就像在视频中添加黑框/挤压它一样。有什么想法吗? 最佳答案 使用 O(键),您将自动缩放设置为“原始大小”。然后,Alt
我找到了这个 Material ,http://wiki.videolan.org/Documentation:Play_HowTo/Format_String .我在我的文件名前缀中尝试视频的时间码
在VLC Player上播放原始视频(.yuv)文件时。如何告诉VLC视频的宽度,高度和帧速率? 最佳答案 试试这个: vlc --demux rawvideo --rawvid-fps 25 --r
我是一名优秀的程序员,十分优秀!