<?php
$pSock = fscokopen ("loaclhost", 80);
fputs ($pSock, "GET / HTTP/1.1\r\n");
fputs ($pSock, "Host: localhost\r\n");
fputs ($pSock, "Connection: close\r\n");// это опционально, что б быстрей работало
fputs ($pSock, "\r\n"); // пустой заголовок - конец всему
echo "<pre>";
while (!feof ($pSock))
echo htmlspecialchars (fgets ($pSock, 1000));
echo "</pre>";
fclose ($pSock)
?>
CGI C++ URL
Пишу на Си. Вопрос таков:
Как мне из Сишной программы запросить страницу с заданным УРЛом?
То есть нужен эффект как в cURLе, если кто знаком с РНР...
На запрос cURL http://www.php.net даёт целую кучу красивых и разных функций.
Это библиотека C(++) с мордой для командной строки на *nix-системах.
Вот так можно из командной строки работать с URL`ами:
Цитата:
sniff@3vamp:~> curl -I http://forum.codenet.ru/showthread.php?t=33434
HTTP/1.1 200 OK
Date: Wed, 21 Mar 2007 02:47:31 GMT
Server: Apache/1.3.37 (Unix) PHP/4.4.4
X-Powered-By: PHP/4.4.4
Set-Cookie: bblastvisit=1174445251; expires=Thu, 20 Mar 2008 02:47:31 GMT; path=/; domain=.codenet.ru
Set-Cookie: bblastactivity=0; expires=Thu, 20 Mar 2008 02:47:31 GMT; path=/; domain=.codenet.ru
Cache-Control: private
Pragma: private
Connection: close
Content-Type: text/html; charset=windows-1251
sniff@3vamp:~>
HTTP/1.1 200 OK
Date: Wed, 21 Mar 2007 02:47:31 GMT
Server: Apache/1.3.37 (Unix) PHP/4.4.4
X-Powered-By: PHP/4.4.4
Set-Cookie: bblastvisit=1174445251; expires=Thu, 20 Mar 2008 02:47:31 GMT; path=/; domain=.codenet.ru
Set-Cookie: bblastactivity=0; expires=Thu, 20 Mar 2008 02:47:31 GMT; path=/; domain=.codenet.ru
Cache-Control: private
Pragma: private
Connection: close
Content-Type: text/html; charset=windows-1251
sniff@3vamp:~>
Естественно, этот функционал есть и в библиотеке CURL.
Пример на PHP:
Код:
точ так же на C
Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void)
{
int iSocket,
iRet;
struct sockaddr_in sSockAddr;
char szBuffer [1024];
iSocket = socket (AF_INET, SOCK_STREAM, 0);
if (iSocket < 0)
{
perror ("Could not create socket.\n");
exit (1);
}
sSockAddr.sin_family = AF_INET;
sSockAddr.sin_port = htons (80);
sSockAddr.sin_addr.s_addr = inet_addr (szIP); // вот это я вырезал... это там всякими gethostbyname () и т.д. добываешь IP
if (connect (iSocket, (struct sockaddr *) &sSockAddr, sizeof (sSockAddr)) < 0)
{
perror ("Could not connect.\n");
exit (2);
}
szBuffer = "GET / HTTP/1.1\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
szBuffer = "Host: localhost\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
szBuffer = "Connection: close\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
szBuffer = "\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
while (1)
{
iRet = recv (iSocket, szBuffer, 1024, 0);
if (iRet < 1)
break;
// а тут можно malloc'ами и strcpy'ями прилеплять к какому нибудь szContent
}
return (0);
}
#include <sys/socket.h>
#include <netinet/in.h>
int main (void)
{
int iSocket,
iRet;
struct sockaddr_in sSockAddr;
char szBuffer [1024];
iSocket = socket (AF_INET, SOCK_STREAM, 0);
if (iSocket < 0)
{
perror ("Could not create socket.\n");
exit (1);
}
sSockAddr.sin_family = AF_INET;
sSockAddr.sin_port = htons (80);
sSockAddr.sin_addr.s_addr = inet_addr (szIP); // вот это я вырезал... это там всякими gethostbyname () и т.д. добываешь IP
if (connect (iSocket, (struct sockaddr *) &sSockAddr, sizeof (sSockAddr)) < 0)
{
perror ("Could not connect.\n");
exit (2);
}
szBuffer = "GET / HTTP/1.1\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
szBuffer = "Host: localhost\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
szBuffer = "Connection: close\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
szBuffer = "\r\n";
iRet = send (iSocket, szBuffer, strlen (szBuffer), 0);
// if (iRet != strlen (szBuffer)) error!!!
while (1)
{
iRet = recv (iSocket, szBuffer, 1024, 0);
if (iRet < 1)
break;
// а тут можно malloc'ами и strcpy'ями прилеплять к какому нибудь szContent
}
return (0);
}
если есть вопросы, постараюсь ответить
P.S. - лучше, но не интересней испоьзовать curl для C
ой, ответил блин ), чё то я не помсотрел на дату поста ))