2010-11-22 20 views
0

LibCurlを使用してこのコードを(Sockets拡張を使用したスクリプト言語を使用して)C++に変換したいと思います。以前は一度だけLibCurlを使用していましたので、他に何が必要になるのかについて少し迷っています。混乱の私の主なポイントは、私はちょうどcurl_easy_setopt(カール、CURLOPT_HTTPHEADER、ヘッダー)を使用することができるはずです。これを送信するか、ソケットを抽出する必要がある場合は、それを送信してください。ソケットからのC++ LibCurl GET

はここで...

public OnSocketConnected(Handle:socket, any:friendId) 
{ 
    decl String:CommunityId[32]; 
    FriendIDToCommunityId(friendId, CommunityId, sizeof(CommunityId)); 

    decl String:query[2048]; 
    decl String:cookieString[100]; 
    decl String:inviterString[32]; 
    decl String:groupString[32]; 

    GetConVarString(cookie, cookieString, sizeof(cookieString)); 
    GetConVarString(inviter, inviterString, sizeof(inviterString)); 
    GetConVarString(group, groupString, sizeof(groupString)); 


    Format(query, sizeof(query), "GET /actions/GroupInvite?type=groupInvite&inviter=%s&invitee=%s&group=%s HTTP/1.1\r\nHost: steamcommunity.com\r\nConnection: close\r\nCookie: steamLogin=%s\r\n\r\n", inviterString, CommunityId, groupString, cookieString); 
    SocketSend(socket, query); 
    LogMessage("%s", query); 
} 

スクリプトから関連するスニペットであり、ここで私はこれまでC++で持っているものです。最初にソケットを抽出する必要があるように見えますが、ネットワークコーディングに堪能ではないので、ここからどこに行く必要があるのか​​正確にはわかりません。

void InviteToGroup(const char *szUserSteamID, const char *szInviterSteamID, const char *steamUser, const char *steamPass) 
{ 
    CURL *curl; 
    CURLcode res, result; 
    //int sockfd; /* socket */ 
    char errorBuffer[CURL_ERROR_SIZE]; 

    const char *szUserID = GetCommunityID(szUserSteamID); // User's Steam Community ID 
    const char *szInviterID = GetCommunityID(szInviterSteamID); // Inviter's Steam Community ID 
    char *szGroupID = ""; 
    GetGroupCommunityID(1254745, &szGroupID); // Group Steam Community ID 
    const char *szCookie = "76561198018111441%7C%7CC7D70E74A3F592F3E130CCF4CAACD4A7B9CAD993"; // Steam Community Login Cookie 

    char *buffer = new char[512]; 

    // Create the GET request 
    struct curl_slist *headers = NULL; 
    headers = curl_slist_append(headers, "GET /actions/GroupInvite?type=groupInvite&inviter="); 
    snprintf(buffer, sizeof(buffer), "%s&invitee=%s&group=%s ", szInviterID, szUserID, szGroupID); 
    headers = curl_slist_append(headers, buffer); 
    headers = curl_slist_append(headers, "HTTP/1.1\r\nHost: steamcommunity.com\r\nConnection: close\r\nCookie: "); 
    snprintf(buffer, sizeof(buffer), "steamLogin=%s\r\n\r\n", szCookie); 
    headers = curl_slist_append(headers, buffer); 

    delete buffer; 

    // Init CURL 
    curl = curl_easy_init(); 

    if(curl) 
    { 
     curl_easy_setopt(curl, CURLOPT_URL, "https://www.steamcommunity.com"); 
     curl_easy_setopt(curl, CURLOPT_PORT, 443); // Check this before using 
     curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); 
     //curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1); // No transfer, just extract the socket 

     // Find out if we need to use Proxy stuff here 

     char *userpass = new char[64]; 
     snprintf(userpass, sizeof(userpass), "%s:%s", steamUser, steamPass); 
     curl_easy_setopt(curl, CURLOPT_USERPWD, userpass); 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 

     // Attempt to Connect the Steam Community Server 
     res = curl_easy_perform(curl); 

     if (res == CURLE_OK) 
      Msg("Connected Successfully!\n"); 
     else 
      Msg("Connection Failed! Error: %s\n", errorBuffer); 

     // Close the connection 
     curl_easy_cleanup(curl); 
    } 
} 

答えて

0

ここでは、C++の修正は正しくありません。これはコードが機能しないことを意味します。

sizeof(char *)は、文字列の長さではなく、ポインタのサイズです。あなたのsnprintfはヌルターミネータを含む32ビットシステムで最大4文字を出力するので、実際には長さ3の文字列しか得られません。

"十分に大きいはずです"バッファは新しいものでそれを割り当てません。 snprintfを使いたい場合はstd :: vectorを使い、実際に書き込まれる文字列の長さであるsnprintfの戻り値を確認し、必要であれば戻り値+ 1までバッファサイズを増やしてください。

vector<char> buffer; 
size_t required = 511; 
do 
{ 
    buffer.resize(required + 1); 
    required = snprintf(&buffer[0], buffer.size(), formatstr, ...); 
} 
while(required >= buffer.size()); 

自動的にそれを行いますベクトルとして(ちなみにあなたは間違っていた)最後に不要に「空き」バッファがありません。

& buffer [0]を関数に渡すと、ヌルで終了する文字列を指し、APIがconst char *ではなくchar *を必要とする場合は書き込み可能になります。 (libcurlはcurl_easy_setoptの3番目の引数として "anything"を渡すことができるので、誤ってstd :: stringを渡すとコンパイラから警告を受け取らないように注意する必要があります。 std :: vector)。

関連する問題