Самое простое C ++ PUSH уведомление / POST решение для использования внутри DLL?

Я делаю плагин для Winamp с единственной функцией отправки информации о песне, воспроизводимой по HTTP, на веб-страницу / веб-сервер. Я не мог найти ничего подобного, что действительно работает, поэтому решил впервые погрузиться в C ++ и просто сделать это сам.

Плагин представляет собой C ++ DLL-файл. Я дошел до того, что могу выводить название песни в окно сообщения Windows при каждом воспроизведении новой песни (неплохо для новичка в C ++!;))

Где я застрял:

Я не смог найти ничего, что могло бы заставить меня получить уведомление о направлении C ++.

Я безуспешно пытался встроить / включить библиотеки HTTP в мою DLL, чтобы вместо этого пытаться отправлять запросы. libcurl, это библиотека здесь, а также эта библиотека тоже — но не смог заставить никого из них работать! Я просто продолжал получать ссылки ошибок, а затем некоторые. Через несколько часов я просто сдался.

Я очень опытный программист JavaScript, поэтому я подумал, что, возможно, использование JS для подключения к службе push-уведомлений может сработать, но запуск JS внутри C ++ выглядит слишком сложным для меня. Возможно я не прав?

В итоге, я не знаю, какое решение лучше (читай: проще) реализовать — push-уведомления или отправка запросов?

Я ценю любые решения / вход / направления / информацию или что вы получили. Я могу опубликовать код, но единственный код, который у меня есть, это часть, которая получает информацию о песне из Winamp, и эта часть работает.

Заранее спасибо.

РЕДАКТИРОВАТЬ: я думаю, стоит отметить, что я использую новый VS2012?

2

Решение

Это нормально для использования библиотек такого типа, но когда я говорю о 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, я закомментировал printfs, так что вы можете использовать правильную функцию вывода в соответствии с 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::strings для парсинга названия песни и исполнителя в строку сообщения POST безопасно, если вы еще не знаете, я рекомендую эта ссылка.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]