2013-06-27 3 views
7

Как я могу открыть URL-адрес из моей программы на C++?Открыть URL-адрес из кода C++

В рубина вы можете сделать

%x(open https://google.com) 

Что такое эквивалент в C++? Интересно, есть ли независимое от платформы решение. Но если нет, то я хотел бы в Unix/Mac лучше :)

Вот мой код:

#include <stdio.h> 
#include <string.h> 
#include <fstream> 

int main (int argc, char *argv[]) 
{ 
    char url[1000] = "https://www.google.com"; 

    std::fstream fs; 
    fs.open(url); 
    fs.close(); 

    return 0; 
} 
+2

библиотеки Qt предоставляет платформу независимого путь к сделай это. В этом языке нет ничего, чтобы обеспечить это. – drescherjm

+5

Почему название этого вопроса полностью отличается от фактического предмета? –

+0

Извините, все исправлено. Благодарю. – rodrigoalves

ответ

12

Использование libcurl, вот простой example.

EDIT: Если речь идет о запуске веб-браузер от C++, вы можете вызвать команду оболочки с system в системе POSIX:

system("<mybrowser> http://google.com"); 

Заменяя <mybrowser> с браузером вы хотите запустить.

+2

Ваше обновление - именно то, что я хотел. См. Приложение на странице https://gist.github.com/rodrigoalvesvieira/662e400f34dd9de38176 – rodrigoalves

3

C не такой высокий уровень, как упоминаемый вами язык сценариев. Но если вы хотите держаться подальше от программ на основе сокетов, попробуйте Curl. Curl - отличная библиотека C и имеет множество функций. Я использовал его в течение многих лет и всегда рекомендую его. Он также включает некоторые самостоятельные программы для тестирования или использования оболочки.

+1

@rodrigoalves Curl доступен практически на любой ОС, включая множество вариантов как Windows, так и Linux. Это стоит того, чтобы изучить его. У этого есть много, много замечательных особенностей. –

+0

Да. Я часто использовал терминал, в основном для тестирования выходных данных API и т. Д. Никогда из программы C++, tho. – rodrigoalves

15

Ваш вопрос может означать две разные вещи. 1) Открыть веб-страницу с браузером.

ShellExecute(0, 0, L"http://www.google.com", 0, 0 , SW_SHOW); 

Это должно работать, оно открывает файл с соответствующей программой. Должен открывать браузер, обычно он по умолчанию. 2) Получите код веб-страницы, и вы сами сделаете его или сделаете что-нибудь другое. Для этого я хотел бы прочитать this или/this

Надеюсь, это хоть немного поможет.

EDIT: Не заметил, что вы просите в UNIX, эта работа работает только в Windows.

+0

это только для Windows, не так ли? Я имею в виду ShellExecute. Спасибо в любом случае – rodrigoalves

+1

Это окно только для запуска браузера по умолчанию, чтобы открыть URL-адрес. ОП особо отмечал независимость платформы. Qt обеспечит, что, хотя для этой задачи было бы довольно тяжело ... – drescherjm

+0

Просто чтобы задать этот вопрос немного интереснее: что делать, если я хочу запустить обычную терминальную программу из моего кода на C/C++. Есть ли способ? Например, запустите cd – rodrigoalves

4

Вот пример кода Windows с использованием winsock.

#include <winsock2.h> 
#include <windows.h> 
#include <iostream> 
#include <string> 
#include <locale> 
#pragma comment(lib,"ws2_32.lib") 
using namespace std; 

string website_HTML; 
locale local; 


void get_Website(char *url); 

int main() 
{ 
    //open website 
    get_Website("www.google.com"); 

    //format website HTML 
    for (size_t i=0; i<website_HTML.length(); ++i) 
     website_HTML[i]= tolower(website_HTML[i],local); 

    //display HTML 
    cout <<website_HTML; 

    cout<<"\n\n"; 



    return 0; 
} 



//*************************** 
void get_Website(char *url) 
{ 
    WSADATA wsaData; 
    SOCKET Socket; 
    SOCKADDR_IN SockAddr; 


    int lineCount=0; 
    int rowCount=0; 

    struct hostent *host; 
    char *get_http= new char[256]; 

     memset(get_http,' ', sizeof(get_http)); 
     strcpy(get_http,"GET/HTTP/1.1\r\nHost: "); 
     strcat(get_http,url); 
     strcat(get_http,"\r\nConnection: close\r\n\r\n"); 

     if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
     { 
      cout << "WSAStartup failed.\n"; 
      system("pause"); 
      //return 1; 
     } 

     Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
     host = gethostbyname(url); 

     SockAddr.sin_port=htons(80); 
     SockAddr.sin_family=AF_INET; 
     SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); 

     cout << "Connecting to "<< url<<" ...\n"; 

     if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0) 
     { 
      cout << "Could not connect"; 
      system("pause"); 
      //return 1; 
     } 

     cout << "Connected.\n";  
     send(Socket,get_http, strlen(get_http),0); 

     char buffer[10000]; 

     int nDataLength; 
      while ((nDataLength = recv(Socket,buffer,10000,0)) > 0) 
      {  
       int i = 0; 

       while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') 
       {      
        website_HTML+=buffer[i];      
        i += 1; 
       }    
      } 
     closesocket(Socket); 
     WSACleanup(); 

      delete[] get_http; 
} 
+2

Это на самом деле то, что в заголовке темы в настоящее время говорит, но я верю из комментариев, что вопрос на самом деле «Как открыть URL-адрес в браузере по умолчанию из кода C++ с использованием независимого от платформы метода?» – drescherjm

0

У меня было БОЛЬШЕ удача, использующая ShellExecuteA(). Я слышал, что при использовании «system()» существует множество угроз безопасности. Это то, что я придумал для своего собственного кода.

void SearchWeb(string word) 
{  
    string base_URL = "http://www.bing.com/search?q="; 
    string search_URL = "dummy"; 
    search_URL = base_URL + word; 

    cout << "Searching for: \"" << word << "\"\n"; 

    ShellExecuteA(NULL, "open", search_URL.c_str(), NULL, NULL, SW_SHOWNORMAL); 
} 

p.s. Его использование WinAPI, если я прав. Поэтому это не мультиплатформенное решение.

+0

Благодарим вас за обнаружение ошибки котировки. По-видимому, что-то было удалено, когда я скопировал свой код. – ahogen

-2

Создайте функцию и скопируйте код с помощью winsock, о котором уже упоминалось Software_Developer.

Например:

#ifdef _WIN32 

// this is required only for windows 

if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
{ 

    //... 

} 

#endif 

Winsock код здесь

#ifdef _WIN32 

WSACleanup(); 

#endif 
0

Там вы уже отвечает за окнами. В Linux, я заметил open https://www.google.com всегда запускать браузер из оболочки, так что вы можете попробовать:

system("open https://your.domain/uri");

, что скажем

system(("open "s + url).c_str()); // c++

https://linux.die.net/man/2/open

Смежные вопросы