c++ - 在 DLL 中使用的最简单的 C++ PUSH 通知/POST 解决方案?

标签 c++ post dll push-notification winamp

我正在制作一个 Winamp 插件,其单一功能是通过 HTTP 将正在播放的歌曲的详细信息发送到网页/网络服务器。我找不到像这样实际有效的东西,所以决定第一次深入 C++ 并自己动手做。

该插件是一个 C++ DLL 文件。我已经到了每次播放新歌曲时都可以将歌曲标题输出到 Windows 消息框的地步(对于 C++ 初学者来说不错!;))

我卡在哪里了:

我根本找不到任何东西让我进入 C++ 方向的推送通知。

我尝试将 HTTP 库嵌入/包含到我的 DLL 中以尝试发布请求,但没有成功。 libcurl,这个 library here , 和 this library太 - 但无法让他们中的任何一个工作!我只是不断收到链接错误,然后是一些。几个小时后,我就放弃了。

我是一个非常熟练的 JavaScript 程序员,所以我认为也许使用 JS 连接到推送通知服务可以解决问题,但在 C++ 中运行 JS 对我来说太复杂了。也许我错了?

最重要的是,我不知道哪种解决方案实现起来更好(阅读:更容易)——推送通知还是发布请求?

我感谢任何解决方案/输入/方向/信息或任何你得到的。我可以发布代码,但我拥有的唯一代码是从 Winamp 获取歌曲信息的部分,并且该部分有效。

提前致谢。

编辑:我想值得注意的是我正在使用新的 VS2012?

最佳答案

使用这些库没问题,但说到 C++,我主要想到的是“纯代码”,所以我喜欢原生风格做一些事情,而且不需要库的帮助。

考虑到这一点,我可以为您提供一个示例,说明如何使用 Microsoft 的 winsock2 库发送 HTTP 的 POST 请求。

首先,我想指出我使用了 this link了解如何使用 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,这样您就可以根据Winamp 插件API 使用适当的输出函数。

现在,要使用这个函数,它是不言自明的:

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 来安全地将歌曲名称和艺术家解析为 POST 消息字符串,如果你还不知道,我推荐this link .

关于c++ - 在 DLL 中使用的最简单的 C++ PUSH 通知/POST 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12427585/

相关文章:

c++ - 如何处理二维数组中写入的条件

python - 使用 POST 请求的谷歌反向图像搜索

c# - 调试 com 可见 dll 托管代码

C++ 强制非 constexpr 上下文

c++ - 在《Effective C++》书中的这个示例中,返回对象指针的函数的实现细节是什么?

c++ - 关于 istringstream 和 >>operator

java - 在 Java 中运行 Javascript 表单请求

Google App Engine 中的 HTML

winforms - 在运行时调用多线程 DLL

.lib 中的 C++ 静态变量未初始化