cpp

Mattepuffo's logo
Da CURLcode a string in C++

Da CURLcode a string in C++

In questo articolo abbiamo introdotto l'uso di CURL in C++ facendo un esempio di base.

In genere però é più probabile dover trasformare la risposta che ci arriva come oggetto CURLcode, ad esempio in string perchè poi processata.

Ad esempio se ci arriva in JSON (come nel mio caso).

Quindi dobbiamo convertire CURLcode in string.

Per farlo dobbiamo apportare un pò di modifiche; cominciamo dal file .h:

#ifndef READ_H
#define    READ_H

#include <iostream>
#include <curl/curl.h>

using namespace std;

extern "C" int readCurlHelper(char *data, size_t size, size_t nmemb, string *buffer);

class Read {
public:
    Read();
    virtual ~Read();
    void read(string file);
    size_t curlToString(char *data, size_t size, size_t nmemb, string *buffer);
private:
    string response;
    string url;
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers;
};

#endif

Abbiamo aggiunto due funzioni, una interna che si occupa di costruire la stringa, e una esterna che si occupa della conversione.

Mattepuffo's logo
Richieste HTTP e JSON con C++ e CURL

Richieste HTTP e JSON con C++ e CURL

Oggi vedremo come usare la libreria CURL con il C++.

Il codice che vedremo è abbastanza multi piattaforma; ovviamente è necessario installare CURL e linkare il percorso giusto alla libreria, cose che differiscono da OS a OS.

Su Linux e Mac dovreste avere già CURL preinstallato; su Windows vi consiglio di procedere installando Cygwin.

Non mi soffermo su questo passaggio, ma do per scontato che l'abbiate fatto.

Detto ciò creiamo una nostra classe per usare questa libreria.

Cominciamo con il file .h:

#ifndef READ_H
#define    READ_H

#include <iostream>
#include <curl/curl.h>

using namespace std;

class Read {
public:
    Read();
    virtual ~Read();
    void read(string file);
private:
    string url;
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers;
};

#endif

Nella classe abbiamo definito una funzione per leggere i dati da un file preso in remoto; la funzione richiede un unico parametro, che è appunto il file da chiamare.

Mattepuffo's logo
Usare le map in C++

Usare le map in C++

Le map sono dei contenitori formati da una chiave al quale corrisponde un valore.

In genere le chiavi vengono usate per ordinare e identificare un determinato valore; come se fosse un indice.

Il valore invece corrisponde al valore di una determinata chiave.

Nell'ultimo standard, il C++11, non ha subito molte varizioni.

Mattepuffo's logo
Calcolare data e ora corrente in C++

Calcolare data e ora corrente in C++

Vediamo oggi una piccola funzione per calcolare data e ora corrente in C++.

Per farlo ci bastano poche righe di codice e la libreria ctime.

Da questa libreria prenderemo:

  • la funzione time(), che ritorna un oggetto di tipo time_t e in pratica legge l'ora corrente come numero di secondi trascorsi dal 1° Gennaio 1970
  • la funzione asctime(), che converte l'orario in stringa
  • la funzione localtime(), che contiente l'ora corrente suddivisa in diverse parti (giorni, ore, ecc)
  • la funzione strftime(), per formattare l'output

Quindi la nostra funzione sarà qualcosa del genere:

#include <iostream>
#include <ctime>

using namespace std;

int main() {
    time_t currentTime;
    time(&currentTime);
    cout << asctime(localtime(&currentTime)) << endl;
    return 0;
}

Creiamo una variabile di tipo time_t.

Poi con la funzione time() leggiamo l'ora corrente e la salviamo nella varibile currentTime.

Poi stampiamo l'output usando asctime() per trasformare in stringa l'ora corrente che ci viene restituita dal localtime().

L'ouput sarà una tipo questo:

Wed Dec 12 12:59:09 2012

Non molto ben formattato a dire il vero.

Mattepuffo's logo
Intercettare tasto invio in C++

Intercettare tasto invio in C++

Ho un programma in C++ che si avvia e rimane attivo in attesa di connessioni con un ciclo infinito.

Voglio poterlo terminare usando il semplice tasto ENTER / INVIO.

Vediamo come fare sia in Visual C++ (quindi una versione per Windows), sia in C++ usando Ncurses (che gira quindi su Linux).

Visto che la versione VC++ è più semplice partiamo da qua.

Per controllare la pressione dei tasti su Windows dobbiamo usare la libreria conio.h.

Quindi includiamola e poi nel main:

#include // TUTTO QUELLO CHE VI SERVE
................
#include <conio.h>

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
       // LANCIO PROGRAMMA CON CICLO INFINITO
       if(_getch() == 13)
       {
           // ESCO DAL PROGRAMMA
       }
      return 0;
}

La funzione _getch() controlla il carattere premuto; nella tabella ASCII il 13 corrisponde ad ENTER.

Se viene premuto esco dal programma.

Per Linux invece dobbiamo agire in maniera diversa in quanto conio.h è una libreria specifica Microsoft.

Ci sono vari porting per Linux, ma da quanto ho capito si basano anche su Ncurses.

Quindi io ho usato direttamente questa libreria.

Per programmare con questa libreria bisogna prima installare i pacchetti devel; su Opensuse:

# zypper install ncurses-devel

Questo pacchetto non è richieso per l'esecuzione, ma è comunque richiesto ncurses.

Mattepuffo's logo
Windows server socket in C++

Windows server socket in C++

Chiariamo subito che parliamo di Visual C++, quindi il programma userà le librerie di Windows e non sarà usabile su altri sistemi (ho in programma di creare una versione per Linux).

Nello specifico useremo le librerie Winsock.

Iniziamo a creare un progetto in Visual Studio di tipo VC++ console; aggiungete anche le librerie MFC in fase di creazione.

MFC ci servirà per implementare il multi-thread!

Una volta creato il progetto aprite il file stdafx.h e aggiungete queste righe:

#include <WinSock2.h>
#include <conio.h>
using namespace std;

Così facendo avremo disponibile il tutto per tutto il progetto.

Dopo di che creiamo una nuova classe che chiameremo Server.

Nel file di intestazione ci sarà questo:

#pragma once

using namespace std;

class Server {
public:
    Server();
    virtual ~Server();
    UINT initConnection();
    void stopConnection();
private:
    SOCKET server;
    SOCKET inAscolto;
};

In pratica abbiamo aggiunto due funzioni (una per la connessione e una per la disconnessione) e due variabili private.

Fin qui direi nulla di difficile.