LINUX.ORG.RU

Re: как сделать запрос на картинку?

а зачем тебе качать c++? ты же картинку хочешь?

алсо, виноват мозговой слизень с Марса, который подло зафигачл ошибку в 17-ю строку.

engage ()

Re: как сделать запрос на картинку?

> вот так не качается с++

Скорее всего дело не в запросе, а где-то в коде.
Вот работающий пример (без проверки ошибок и возможно с багами в коде =)):

#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

static const char *const c_host = "rsdn.ru";
static const char *const c_port = "80";
static const char *const c_request =
	"GET /Images/rsdntop.gif HTTP/1.1\r\n"
	"Host: rsdn.ru\r\n"
	"\r\n";
static const char *const c_gif = "result.gif";

int main()
{
	struct addrinfo hint, *addr;
	int             sock, file;
	ssize_t         readed;
	char            buf[256];
	int             i, rn = 0;
	int             content = 0;
	
	memset(&hint, 0, sizeof(hint));
	hint.ai_family = AF_INET;
	hint.ai_socktype = SOCK_STREAM;
	getaddrinfo(c_host, c_port, &hint, &addr);
	
	sock = socket(AF_INET, SOCK_STREAM, 0);
	connect(sock, addr->ai_addr, sizeof(struct sockaddr_in));
	
	freeaddrinfo(addr);
	
	write(sock, c_request, strlen(c_request));
	
	file = open(c_gif, O_WRONLY | O_CREAT | O_TRUNC, 00644);
	
	while (1)
	{
		readed = read(sock, buf, sizeof(buf));
		if (-1 == readed)
			return 1;
		if (!readed)
			break;

		if (content)
		{
			write(file, buf, readed);
		} else {
			for (i = 0; i < readed; ++i)
			{
				if ('\n' == buf[i])
					++rn;
				else if ('\r' == buf[i])
					;
				else
					rn = 0;
				
				if (2 == rn)
				{
					content = 1;
					write(file, buf + i + 1,
						readed - i - 1);
					
					break;
				}
			}
		}
	}
	
	close(file);	
	close(sock);
	
	return 0;
}

Картинка скачивается в файл result.gif в текущей директории.

Deleted ()
Ответ на: Re: как сделать запрос на картинку? от anonymous

Re: как сделать запрос на картинку?

>> и что? каждый раз так же заново пишешь? через сокеты и системные вызовы? мне тебя жалко...

Человек спрашивал про HTTP-запрос, и я дал простейший рабочий пример. Сам я использую libcurl, если в программе что-то нужно загрузить по HTTP.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.