На данный вопрос уже ответили:
Как в c++ отправить get запрос? например: Отправляем запрос на vk.com и в консоль выводится Ф.И.О, как это сделать?
Ниже приведен пример того, как скачать файл, отправив GET запрос.
/*формирование самого запроса*/
std::string create_GET_request(const std::string &hostname, const std::string &path) {
if(path.empty() || hostname.empty()) {
return "";
}
else {
return "GET " + path + " HTTP/1.1\r\n" +
"Host:" + hostname + "\r\n" +
"Connection: close\r\n\r\n";
}
}
int main()
{
std::string hostname = "foo.com";
std::string path = "/bar/baz";
std::string request = create_GET_request(hostname, path);
if(request.empty()) {
return 1;
}
char recvBuff[1024]; //буфер, в который будет записываться ответ
int sock_descriptor;
sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
if(sock_descriptor < 0) {
std::cout << "Failed creating socket\n" << std::endl;
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
struct hostent *server;
server = gethostbyname(hostname.c_str());
if(server==NULL) {
std::cout << "Failed to find server name" << std::endl;
return 0;
}
serv_addr.sin_family = AF_INET;
memcpy((char *) &(serv_addr.sin_addr.s_addr), (char *)(server->h_addr), server->h_length);
serv_addr.sin_port = htons(80);
if(connect(sock_descriptor, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { //подключение к серверу
std::cout << "Failed to connect to server" << std::endl;
} else {
std::cout << "Succesfully connected" << std::endl;
}
write(sock_descriptor, request.c_str(), request.size()); //отправка запроса
bool isFile = false;
std::ofstream outFile;
std::string filename = basename(path);
if(filename.empty())
std::cout << "Incorrect filename!\n";
outFile.open(filename, std::ios::out /*| std::ios::binary*/);
int bytes;
const char* phrase = "\r\n\r\n";
while(true) {
memset(recvBuff, 0, 1024);
if((bytes = read(sock_descriptor, recvBuff, sizeof(recvBuff)-1)) > 0) { //получение ответа
std::cout << bytes << std::endl;
if(isFile) {
outFile.write(recvBuff, bytes);
} else {
std::cout << recvBuff << std::endl;
char *remain = strstr(recvBuff, phrase); ///get end of body
char *filename_begin = strstr(recvBuff, "filename*=UTF-8''"); ///get filename
if(filename_begin) {
filename_begin += 17;
std::string true_filename(filename_begin);
int lenght = true_filename.find('\n');
filename_begin[lenght] = '\0';
std::cout << true_filename << std::endl;
}
if(remain) {
remain += 4; //move ahead of \r\n\r\n;
int len = bytes - (remain - recvBuff);
outFile.write(remain, len);
isFile = true;
}
}
} else {
outFile.close();
return 0;
}
}
outFile.close();
std::cout << "finished";
return 0;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем привет, продолжая изучать javaEE (servlets) столкнулся с проблемойИспользую куки, хранящие какую локаль использовать юзеру
Сегодня встретил следующую фразу "Класс String-кэширует хэш-код при первом вызове метода hashCode"Вопросы: Зачем он его кэширует? Почему при первом...
Вот варианты применения этих методовКогда какой использовать и чем они отличаются?
Есть несколько классов объекты которых должны создаваться спрингом: