3

HTTP 経由で再生中の曲の詳細を Web ページ/Web サーバーに送信する単一の機能を持つ Winamp プラグインを作成しています。このような実際に機能するものを見つけることができなかったので、初めて C++ に飛び込んで自分でやることにしました。

プラグインは C++ DLL ファイルです。新しい曲が再生されるたびに曲のタイトルを Windows メッセージ ボックスに出力できるようになりました (C++ の初心者にとっては悪くありません! ;))

どこで立ち往生していますか:

C ++方向のプッシュ通知で私を取得するものは何も見つかりませんでした。

成功せずに、HTTP ライブラリを DLL に埋め込んだり含めたりして、代わりにポスト リクエストを試みました。libcurl、このライブラリ here、およびこのライブラリも - しかし、それらのどれも動作させることができませんでした! リンクエラーが発生し続け、その後いくつかのエラーが発生しました。数時間後、私はあきらめました。

私は非常に熟練した JavaScript プログラマーなので、おそらく JS を使用してプッシュ通知サービスに接続すればうまくいくと思いましたが、C++ 内で JS を実行するのは複雑すぎるように思えます。おそらく私は間違っていますか?

要するに、プッシュ通知と投稿リクエストのどちらのソリューションが実装するのに適しているか (読み取り: より簡単か) がわかりません。

解決策/入力/指示/情報、またはあなたが得たものに感謝します。私はコードを投稿できますが、私が持っている唯一のコードは、Winamp から曲情報を取得する部分であり、その部分は機能します。

前もって感謝します。

編集:私は新しい VS2012 を使用していることに注意する価値があると思いますか?

4

1 に答える 1

3

このようなライブラリを使用するのは問題ありませんが、C++ について言えば「純粋なコード」を主に考えるので、ライブラリの助けを借りずにネイティブ スタイルで何かを行うのが好きです。

そのことを考えて、Microsoft の winsock2 ライブラリを使用して、HTTP の POST 要求を送信する方法の例を提供できます。

まず、 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 を使用しているため、s をコメントアウトした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::strings を操作して曲名とアーティストを POST メッセージ文字列のポストに安全に解析する方法を知る必要があります。まだわからない場合は、このリンクをお勧めします。

于 2012-09-17T08:00:12.247 に答える