cp

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.

Mattepuffo's logo
Informazioni utente con C++ su Linux

Informazioni utente con C++ su Linux

Questo articolo si riferisce a Linux e forse, ma non ho ancora provato, anche ai Mac visto che sono molto simili.

Non funzionerebbe invece su Windows.

Quello che vogliamo fare è recuperare informazioni sull'utente usando un piccolo programmino scritto in C++.

Avremo bisogno di alcune cose:

  • struct passwd -> una struttura dati che contiente le informazioni dell'utente
  • un dato di tipo uid_t -> corrisponde all'ID dell'utente nel sistema
  • getpwuid(ID)
  • geteuid() -> ritortna l'ID reale dell'utente

Per questi ulitmi guardate le pagine man per vedere bene a cosa servono e quali librerire richiedono.

A questo punto vediamo come strutturare il tutto.

Mattepuffo's logo
Creare file in C++ e QFileDialog

Creare file in C++ e QFileDialog

Con questo articolo prendo due piccioni con una fava; vedremo sia come usare un QFileDialog per decidere dove salvare i file, sia come salvarli fisicamente usando il puro C++.

Dire di cominciare dalla parte grafica Qt.

Come componente grafico di input ho usato una QAction in modo da mettere nel menu File la classica voce Salva.

Poi ho creato una funzione dentro alla MainWindow e collegato le due (per vedere nel dettagli come si fa guardate qua):

connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(saveFile()));

...........

void MainWindow::saveFile()
{
    QString filename = QFileDialog::getSaveFileName(this, tr("Save"), QDir::homePath(), tr("TXT(*.txt);;DOC(*.doc)"));
    char *cFilename = filename.toAscii().data();
    SaveResult save;
    save.saveFile(cFilename, ui->txtResult->toPlainText().toStdString());
}

Qua potete vedere la doc ufficiale relativa alla funzione getSaveFileName().

Il primo parametro indica la finestra parent.

Mattepuffo's logo
QWidget a dimensione fissa

QWidget a dimensione fissa

Abituato a Swing ci sono rimasto un pò male nel vedere che QWidget a dimensione fissa non ha una funzione per impostare che la finestra non sia ridimensionabile.

Ovviamente con un piccolo sotterfugio si può ovviare al problema.

Basta impostare la dimensione, la minimumSize e la maximumSize alla stessa dimensione.

Quindi se si usa l'editor grafico possiamo modificare le relative proprietà, o modificare il file .ui in formato XML:

<widget class="QMainWindow" name="MainWindow">

  <property name="geometry">

   <rect>

    <x>0</x>

    <y>0</y>

    <width>703</width>

    <height>700</height>

   </rect>

  </property>

  <property name="minimumSize">

   <size>

    <width>703</width>

    <height>700</height>

   </size>

  </property>

  <property name="maximumSize">

   <size>

    <width>703</width>

    <height>700</height>

   </size>

</property>

.....

Se invece vogliamo fare tutto da codice possiamo fare una cosa del genere:

Mattepuffo's logo
Eseguire comandi di sistema in C++

Eseguire comandi di sistema in C++

Eseguire comandi di sistema in C++ non è molto complicato.

Per farlo possiamo usare la funzione system().

Eccovi un semplice esempio su Linux:

#include <stdio.h>

#include <stdlib.h>

int main()

{

    printf("Eseguo comando ls");

    system("ls -l");

    exit(0);

}

Il problema di questa funzione è che anche se stampa il risultato del comando, comunque ritorna un int.

Quindi se ad esempio vogliamo stampare il risultato in un componente grafico tipo un QPlainTextEdit (che richiede quantomeno un oggetto string e non un int) come possiamo fare?

Ci sono diverse soluzioni; io ho usato la funzione popen().

Nel caso specifico ho una piccola classe con una funzione che esegue il comando nmap con i vari parametri.

Mattepuffo's logo
Controllo dei file aperti con Lsof e Fuser

Controllo dei file aperti con Lsof e Fuser

Lsof è un ottimo programma che ci consente di vedere quali sono i file aperti da un determinato processo.

Ha parecchie opzioni interessanti.

Se vogliamo vedere i file aperti da uno specifico programma:

$ lsof -c firefox
COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
firefox 24660 matte  cwd    DIR                8,2     4096 45350914 /home/matte
firefox 24660 matte  rtd    DIR                8,2     4096        2 /
firefox 24660 matte  txt    REG                8,2    82352 40507802 /usr/lib/firefox-4.0/firefox
firefox 24660 matte  mem    REG                8,2    15552 40633085 /usr/lib/libcanberra-0.28/libcanberra-alsa.so
firefox 24660 matte  mem    REG                8,2    36576 39342914 /usr/lib/libltdl.so.7.3.0
firefox 24660 matte  mem    REG                8,2    68912 39350927 /usr/lib/libtdb.so.1.2.9
firefox 24660 matte  mem    REG                8,2    23080 39349622 /usr/lib/libogg.so.0.7.1
firefox 24660 matte  mem    REG                8,2   176920 39349634 /usr/lib/libvorbis.so.0.4.5
firefox 24660 matte  mem    REG                8,2    30160 39349633 /usr/lib/libvorbisfile.so.3.3.4
firefox 24660 matte  mem    REG                8,2    65736 39338584 /usr/lib/libcanberra.so.0.2.5
firefox 24660 matte  mem    REG                8,2   192863 39329202 /usr/lib/libaudiofile.so.0.0.2
firefox 24660 matte  mem    REG                8,2    56838 39329237 /usr/lib/libesd.so.0.2.39
firefox 24660 matte  mem    REG                8,2   135240 40373785 /usr/lib/mozilla/plugins/npwrapper.libflashplayer.so
firefox 24660 matte  mem    REG                8,2   135240 40633100 /usr/lib/nspluginwrapper/x86_64/linux/npwrapper.so
firefox 24660 matte  mem    REG                8,2    62448 52166897 /opt/java/jre/lib/amd64/libnpjp2.so
firefox 24660 matte  mem    REG                8,2    10832 39349158 /usr/lib/libXss.so.1.0.0
firefox 24660 matte  mem    REG                8,2    22912 35127433 /lib/libnss_dns-2.13.so
firefox 24660 matte  mem    REG                8,2   574636 40246503 /usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf
firefox 24660 matte  mem    REG                8,2   359272 40239110 /usr/share/fonts/TTF/FreeSansBold.ttf
firefox 24660 matte  mem    REG                8,2   610412 39356875 /usr/lib/libnssckbi.so
firefox 24660 matte  mem    REG                8,2   412559 39356877 /usr/lib/libfreebl3.so
firefox 24660 matte  mem    REG                8,2   191643 39356876 /usr/lib/libnssdbm3.so
firefox 24660 matte  mem    REG                8,2   297290 39356873 /usr/lib/libsoftokn3.so

..........

L'opzione -c serve proprio a indicare che vogliamo i file aperti da un specifico programma; nel mio caso Firefox.