Raccolta di howto, informazioni, consigli, trucchi e documentazione di varia utilità per ricordare tante cose utili

venerdì 26 febbraio 2010

(MOVED) Uso di Bluez 4.xx in Gentoo Linux

Si vuole illustrare la configurazione di un sistema Gentoo Linux per utilizzare un dispositivo bluetooth con il pacchetto Blue-z nella versione 4.xx

Questo post è stato spostato su:

http://freeehowto.wordpress.com/2010/04/30/uso-di-bluez-4-xx-in-gentoo-linux/

giovedì 11 febbraio 2010

VirtualBox: Montare una cartella condivisa in un guest Ubuntu

VirtualBox, l'applicazione di virtualizzazione open source di Sun, permette di impostare delle cartelle condivise tra sistema host e sistema guest. Sul sistema host le cartelle si condividono con gli appositi menu di configurazione di ciascuna virtual machine di VirtualBox; al momento della condivisione della cartella gli si assegna un nome, ad esempio CARTELLACONDIVISA
Se come guest c'è installato un sistema Ubuntu (o più in generale Linux) per montare la cartella condivisa va dato il comando:
sudo mkdir /mnt/SharedWin
sudo mount.vboxsf CARTELLACONDIVISA /mnt/SharedWin
Da far notare che sul sistema guest devono essere installate le VirtualBox Addition

giovedì 4 febbraio 2010

Realizzazione di un TCP server multithread in linguaggio C, C++

La parte iniziale del programma deve contenere gli include necessari per l'uso dei socket:
#include
#include
#include
#include

int main(int argc, char *argv[])
{
    int sockfd;
    int newsockfd = 0;
    struct sockaddr_in serv_addr, cli_addr;
si crea il socket per il server
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if ( sockfd < 0 ) {
        perror("FATAL: Impossibile aprire il listener TCP");
        exit(1);
    }
si esegue il bind sull'indirizzo/porta voluto
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(0x4bfc);
    if ( bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) {
        perror("FATAL: Impossibile effettuare il bind del listener TCP");
        exit(1);
    }
e lo si pone in ascolto 
    listen(sockfd,5);
a questo punto per ogni nuova connessione entrante accettata si crea uno thread specifico che la gestisce. E' necessario attendere di essere sicuri che il nuovo thread abbia preso in carico il valore del socket da usare per la comunicazione.
    while( true ) {
        socklen_t clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if ( newsockfd < 0 ) {
            perror("Nuova connessione non creata");
        } else {
            pthread_t pTh;
            pthread_create(&pTh, NULL, InitiateThreadTCP, (void *)newsockfd);
            pthread_detach(pTh);
            int maxsleep = 1000;
            while (newsockfd > 0 && maxsleep > 0) {
                usleep(1000);
                maxsleep--;
            }
        }
    }
la funzione di gestine della comunicazione è la seguente, bisogna ricordarsi di definirla all'inizio del file prima del main.
void * InitiateThreadTCP( void *p )
{
    int sck = &(int *)p;
    char rbuffer[1000];
    char sbuffer[1128];
 
    int n = read(sck, rbuffer, 1022);
    if (n >= 0) {
        rbuffer[n] = 0;
        sprintf(sbuffer, "Ricevuto messaggio: %s ", rbuffer);
        write(sck, sbuffer, strlen(sbuffer));
    }
    close(sck);
    pthread_exit( NULL );
}
Di seguito il sorgente completo
#include
#include
#include
#include

void * InitiateThreadTCP( void *p )
{
    int sck = &(int *)p;
    char rbuffer[1000];
    char sbuffer[1128];
 
    int n = read(sck, rbuffer, 1022);
    if (n >= 0) {
        rbuffer[n] = 0;
        sprintf(sbuffer, "Ricevuto messaggio: %s ", rbuffer);
        write(sck, sbuffer, strlen(sbuffer));
    }
    close(sck);
    pthread_exit( NULL );
}

int main(int argc, char *argv[])
{
    int sockfd;
    int newsockfd = 0;
    struct sockaddr_in serv_addr, cli_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if ( sockfd < 0 ) {
        perror("FATAL: Impossibile aprire il listener TCP");
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(0x4bfc);
    if ( bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) {
        perror("FATAL: Impossibile effettuare il bind del listener TCP");
        exit(1);
    }
 
    listen(sockfd,5);

    while( true ) {
        socklen_t clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if ( newsockfd < 0 ) {
            perror("Nuova connessione non creata");
        } else {
            pthread_t pTh;
            pthread_create(&pTh, NULL, InitiateThreadTCP, (void *)newsockfd);
            pthread_detach(pTh);
            int maxsleep = 1000;
            while (newsockfd > 0 && maxsleep > 0) {
                usleep(1000);
                maxsleep--;
            }
        }
    }

    exit(0);
}

Sapere se una directory è un mountpoint da script bash

Il comando mountpoint è un comando presente su molte distribuzioni recenti di Linux che ci permette di sapere se una certa directory è un mountpoint; l'uso delllo switch -q inoltre permette di eseguire il comando senza che generi alcuna uscita nell stdout in modo da usare il comando solo per il suo exit status:
  • == 0 se la directory testata è un mountpoin
  • != 0 se la directory testata NON è un mountpoint
Un esempio di script bash per l'uso del comando è il seguente:

#!/bin/bash
mountpoint -q $1
if [ $? == 0 ]
then
    echo "$1 is è un mountpoint"
else
    echo "$1 non è un mountpoint"
fi