Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c++]

    Salve a tutti
    Sono un principiante alle prime armi col C++ e oggi ho incontrato uno scoglio che proprio non riesco a circuire.
    Utilizzo g++ su Ubuntu Linux.

    Sto lavorando ad un programma che utilizza dei socket e volevo "sintetizzare" la funzione send() in modo da dover solo indicare il puntatore al socket e i dati da inviare.

    Questo è il codice che uso:
    codice:
    template <class T>
    int invia(int sockfd, T *send_buf) {
               if (send(sockfd, send_buf, sizeof(send_buf), 0) == -1) {perror("send");}
    }
    e chiamo la funzione in questo modo:
    codice:
    invia(new_fd, "Prova Prova Prova");

    Utilizzo un template per poter inserire come argomento qualsiasi tipo di variabile e non solo uno.

    Il problema che mi si verifica è che dall'altro "capo" del socket, al posto della stringa desiderata vengono visualizzate solo le prime 4 lettere ("Prov") e il resto scompare, cosa che non accadeva quando invece inserivo manualmente la lunghezza dell'array.

    Qualcuno sa risolvere il mio promlema?

    Grazie in anticipo,
    Benna

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    send_buf è una stringa, più precisamente è il puntatore al primo elemento della stringa.
    sizeof(send_buf) è come se fosse sizeof(&send_buf[0]).
    Sulla tua macchina un puntatore occupa 4 byte di memoria, ecco perchè ti ha inviato 4 caratteri.
    Linkando string.h , puoi passare come parametro della funzione strlen(send_buf)*sizeof(char) anzichè sizeof(send_buf).

  3. #3
    Avevo pensato che 4 byte potesse essere la dimensione di un puntatore, ma il mio problema non si ferma purtroppo solo alle stringhe..
    Io vorrei anche essere in grado di inviare ad esempio degli array di interi senza problemi di conversioni fra tipi, ed è qui che mi blocco...

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    La send() invia byte a prescindere da quello che gli passi, quindi una conversione implicita già c'è. Aggiungiamoci poi che una stringa ASCIIZ del C è un caso particolare di array di char, si ottiene che devi passare anche una dimensione in quel prototipo.
    Partendo dal presupposto che la tua funzione userà solo tipi semplici (int, char, float, etc.), una prima approssimazione può essere:
    codice:
    template <class T>
    int invia(int sockfd, T *send_buf, int len) {
               if (send(sockfd, reinterpret_cast<char*>(send_buf), len * sizeof(T), 0) == -1) {perror("send");}
    }
    Ma a questo punto tanto vale usare direttamente send(), risparmiando una chiamata a funzione.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Potresti spiegarmi gentilmente in cosa consiste quello che hai fato e perché non è possibile determinare "len" a partire da "send_buf"?

    Grazie mille

    Ps: se hai da consigliarmi qualcsa da leggere circa le variabili in C e il casting ti sarei grato.. Abituato come sono a PHP questa tipizzazione mi sta un po' spaventando

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ti è già stato spiegato il perché: send_buf è un puntatore, pertanto la sua dimensione sarà di 4 bytes su architetture 32bit, 8 su architetture 64bit.

    Quello che ho fatto è calcolare la dimensione di T e moltiplicarlo per il numero di elementi dell'array. In questo modo si ottiene la dimensione equivalente dell'array come se fosse di char.

    Se sei alle prime armi, comprati un libro di C++ ( o C se ti interessa solo quello), tenendo presente che C e C++ sono due linguaggi diversi con alcuni punti in comune.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.