Я делаю плагин для Winamp с единственной функцией отправки информации о песне, воспроизводимой по HTTP, на веб-страницу / веб-сервер. Я не мог найти ничего подобного, что действительно работает, поэтому решил впервые погрузиться в C ++ и просто сделать это сам.
Плагин представляет собой C ++ DLL-файл. Я дошел до того, что могу выводить название песни в окно сообщения Windows при каждом воспроизведении новой песни (неплохо для новичка в C ++!;))
Где я застрял:
Я не смог найти ничего, что могло бы заставить меня получить уведомление о направлении C ++.
Я безуспешно пытался встроить / включить библиотеки HTTP в мою DLL, чтобы вместо этого пытаться отправлять запросы. libcurl, это библиотека здесь, а также эта библиотека тоже — но не смог заставить никого из них работать! Я просто продолжал получать ссылки ошибок, а затем некоторые. Через несколько часов я просто сдался.
Я очень опытный программист JavaScript, поэтому я подумал, что, возможно, использование JS для подключения к службе push-уведомлений может сработать, но запуск JS внутри C ++ выглядит слишком сложным для меня. Возможно я не прав?
В итоге, я не знаю, какое решение лучше (читай: проще) реализовать — push-уведомления или отправка запросов?
Я ценю любые решения / вход / направления / информацию или что вы получили. Я могу опубликовать код, но единственный код, который у меня есть, это часть, которая получает информацию о песне из Winamp, и эта часть работает.
Заранее спасибо.
РЕДАКТИРОВАТЬ: я думаю, стоит отметить, что я использую новый VS2012?
Это нормально для использования библиотек такого типа, но когда я говорю о C ++, я в основном думаю о «чистом коде», поэтому мне нравится нативный стиль что-то делать, и делать это без помощи библиотек.
Думая об этом, я могу предоставить вам пример того, как отправить HTTP-запрос POST, используя библиотеку Microsoft winsock2.
Во-первых, я хотел бы отметить, что я использовал эта ссылка иметь представление о том, как использовать winsock2.h.
Хорошо, теперь перейдем к коду, вам нужно это включает в себя:
#include <string>
#include <sstream>
#include <winsock2.h>
Вам также нужно будет связать библиотеку winsock2 (или указать ее в настройках проекта, так как вы используете VS2012):
#pragma comment(lib, "ws2_32.lib")
Теперь функция, отредактированная по ссылке (я только что отредактировал ее, чтобы она выглядела проще, а также для проверки ошибок и правильной очистки):
int http_post(char *hostname, char *api, char *parameters, std::string& message)
{
int result;
WSADATA wsaData;
result = WSAStartup(MAKEWORD(1, 1), &wsaData);
if(result != NO_ERROR)
{
//printf("WSAStartup failed: %d\n", result);
return 0;
}
sockaddr_in sin;
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
{
//printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
struct hostent *host_addr = gethostbyname(hostname);
if(host_addr == NULL)
{
//printf("Unable to locate host\n");
closesocket(sock);
WSACleanup();
return 0;
}
sin.sin_addr.s_addr = *((int *)*host_addr->h_addr_list);
if(connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
//printf("Unable to connect to server: %ld\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 0;
}
std::stringstream stream;
stream << "POST " << api << " HTTP/1.0\r\n"<< "User-Agent: Mozilla/5.0\r\n"<< "Host: " << hostname << "\r\n"<< "Content-Type: application/x-www-form-urlencoded;charset=utf-8\r\n"<< "Content-Length: " << strlen(parameters) << "\r\n"<< "Accept-Language: en-US;q=0.5\r\n"<< "Accept-Encoding: gzip, deflate\r\n"<< "Accept: */*\r\n"<< "\r\n" << parameters
;
if(send(sock, stream.str().c_str(), stream.str().length(), 0) == SOCKET_ERROR)
{
//printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 0;
}
if(shutdown(sock, SD_SEND) == SOCKET_ERROR)
{
//printf("shutdown failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 0;
}
char buffer[1];
do
{
result = recv(sock, buffer, 1, 0);
if(result > 0)
{
//printf("Bytes received: %d\n", result);
message += buffer[0];
}
else if(result == 0)
{
//printf("Connection closed\n");
}
else
{
//printf("recv failed: %d\n", WSAGetLastError());
}
}
while(result > 0);
closesocket(sock);
WSACleanup();
return 1;
}
Поскольку вы используете DLL, я закомментировал printf
s, так что вы можете использовать правильную функцию вывода в соответствии с API плагина Winamp.
Теперь, чтобы использовать функцию, это само за себя:
std::string post;
http_post("www.htmlcodetutorial.com", "/cgi-bin/mycgi.pl", "user=example123&artist=The Beatles&music=Eleanor Rigby", post);
Сделав это и проверив номер возврата функции (1 для успеха или 0 для сбоя), вы можете проанализировать строку результата, возвращенную с сайта, и проверить, все ли прошло нормально.
Что касается вашего последнего вопроса, то использование POST-запроса — это нормально, но вы, как веб-мастер, знаете, что можно «злоупотребить» этой опцией, например, переполнением запроса и т. Д. Но это действительно самый простой способ.
Если вы со стороны сервера правильно анализируете данные и проверяете на предмет ненадлежащего использования запроса, то вы можете использовать этот метод без проблем.
И, наконец, поскольку вы новичок в C ++, вам нужно знать, как манипулировать std::string
s для парсинга названия песни и исполнителя в строку сообщения POST безопасно, если вы еще не знаете, я рекомендую эта ссылка.
Других решений пока нет …