问了几次都没人回答我,哎。。。。。CSDN啊!!!
我想获取get信息到一个网站上所返回的信息.
比如我用:IDhttp,可以用IdHTTP1.Response.ResponseCode获取返回的代码.
但是我想获取一个网站返回的所有信息,比如长度,主机地址等,其实也就是获取它的HTTP头.
该怎么获取..IDHTTP有点慢,貌似可以用winsock 里的recv函数吧? 但是不知道怎么用啊.麻烦给个简单通俗的例子看看,
别发一大串的,好吗?
[解决办法]
调用GetURLContent就可以获取整个网站的内容,如果只要头,在recv那个地方判断改成判断得到的数据是否是以#13#10结尾的就OK了.
function TSearchThread.FormatHead(Method, SvrIP: string; strURL: string;
SvrPort: integer): string;
begin
Result:= Method + ' /'+ strURL +' HTTP/1.1'#13#10; //Get Head
Result:= Result + 'Referer: http://' + SvrIP;
if SvrPort <> 80 then
Result:= Result + ':' + IntToStr(SvrPort);
Result:= Result + '/' + strURL + #13#10;
Result:= Result + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10;
Result:= Result + 'Host: ' + SvrIP;
if SvrPort <> 80 then
Result:= Result + ':' + IntToStr(SvrPort);
Result:= Result + ''#13#10;
Result:= Result + 'Connection: Close'#13#10;
Result:= Result + 'Cache-Control: no-cache'#13#10;
Result:= Result + #13#10;
end;
function TSearchThread.GetURLContent(SvrIP: string; SvrPort: integer;
strURL: string): string;
var
m_wsData: TWSAData;
m_Sock: TSocket;
m_Host: PHostEnt;
m_addr: sockaddr_in;
m_Buf : array[0..1023] of char;
m_iLen: integer;
m_strTmp: string;
begin
Result:= '';
WSAStartUp(MAKEWORD(2, 2), m_wsData);
m_Sock:= Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
m_Host:= GetHostByName(PChar(SvrIP));
if m_Host = nil then
exit;
FillChar(m_addr, SizeOf(m_addr), 0);
m_addr.sin_family:= AF_INET;
m_addr.sin_Port := htons(SvrPort);
m_addr.sin_addr.S_addr:= PDWORD(PDWORD(m_Host.h_addr)^)^;
Connect(m_Sock, m_addr, SizeOf(m_addr));
m_strTmp:= FormatHead('GET', SvrIP, strURL, SvrPort);
//Send data to server
Send(m_Sock, PChar(m_strTmp)^, Length(m_strTmp), 0);
while true do
begin
m_iLen:= Recv(m_Sock, m_Buf, SizeOf(m_Buf), 0);
if (m_iLen < 1) then break;
SetString(m_strTmp, m_Buf, m_iLen);
Result:= Result + m_strTmp;
end;
CloseSocket(m_Sock);
WSACleanUp;
end;