Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 33

Discussione: [C] Buffer socket TCP

  1. #1

    [C] Buffer socket TCP

    Buonasera,

    Sto riscontrando un problema a cui non vengo a capo.
    In sostanza ciò che vorrei riprodurre in C è il comportamento di questa funzione python:

    codice:
    message = struck.pack("!BBi",datochar1,datochar2,intero)
    Vorrei in pratica fosse possibile creare un buffer di char che mantenesse le dimensioni dei tipi dato (es: seguendo l'esempio precedente avendo 2 char e 1 intero la dimensione totale di message è 1+1+4).

    Avendo l'obbligo di utilizzare (nel mio caso) un buffer di char mi trovo costretto a convertire gli interi in char. Utilizzando però le varie sprintf, itoa ecc. la conversione in char (dell'intero value=3 per esempio), ovviamente, implica una "riduzione" dai canonici 4 byte (sizeof(int)) ad un solo byte.

    In sostanza vorrei fosse possibile concatenare una rappresentazione di un intero di dimensione 4 byte al mio buffer di char. Lo ritenete possibile?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Basta un cast
    codice:
    int variabile = 10;
    char* pint = (char*) &variabile;
    per mantenere i 4 bytes.
    Ma non avrai una rappresentazione leggibile e se usi funzioni di stringa (strcpy ad esempio) falliranno miseramente.
    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.

  3. #3
    Originariamente inviato da shodan
    Basta un cast
    codice:
    int variabile = 10;
    char* pint = (char*) &variabile;
    per mantenere i 4 bytes.
    Ma non avrai una rappresentazione leggibile e se usi funzioni di stringa (strcpy ad esempio) falliranno miseramente.
    Non so se l'aggiunta del puntatore possa essere una soluzione valida.
    Il motivo della mia richiesta è che dovrei aggiungere ad inizio buffer uno spazio di 4 byte (rappresentato appunto da un intero) il cui scopo è fare da header e descrivere la lunghezza del buffer. Il server (che non posso modificare) andrà a leggere i primi 4 byte e successivamente il resto del contenuto del buffer.
    Dopo l'aggiunta della rappresentazione dell'intero nel buffer il codice proseguirebbe con una send() che ovviamente allo stato attuale delle cose non ha alcun senso.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Dipende da come il server interpreta quei 4 bytes.
    L'idea di base è più o meno questa:
    codice:
    const char* str = "ciao mondo";
    int len_str = strlen(str);
    int len_buffer = len_str + sizeof(int);
    
    char* buffer = (char*) malloc( len_buffer * sizeof(char) );
    char* pint = (char*) &variabile;
    
    for (int i=0; i < 4; i++) {
        buffer[i] = pint[i];
    } 
    
    for (int i=4; i < len_str; i++) {
        buffer[i] = str[i-4];
    } 
    send(socket, buffer, len_buffer);
    
    free(buffer);
    Crei un buffer grande quanto la stringa da inviare + i 4 bytes dell'header, copi i primi 4 bytes dell'intero trasformato in char*, copi il resto della stringa e invii tutto.
    Però funziona solo se il server adotta il procedimento inverso.
    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
    Adattando il codice l'errore è il seguente: "array subscript is not an integer".
    Il problema inoltre è che purtroppo oltre all'header in testa al buffer ci sono altri dati interi facenti parte del buffer e con i for diventa un po' macchinoso raccapezzarcisi.

    Pensate possano esistere altre soluzioni in grado di emulare quello struct.pack?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    L'errore può essere in fase di adattamento. Se mostri il codice adattato si può capire cosa lo da.
    Poi se non ho capito male, il protocollo prevede 4 bytes in testa + un buffer.
    Altri interi nel buffer li inserisci come faresti con una normale stringa, con sprintf() o itoa().
    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.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da tiziocaio2
    Adattando il codice l'errore è il seguente: "array subscript is not an integer".
    Il problema inoltre è che purtroppo oltre all'header in testa al buffer ci sono altri dati interi facenti parte del buffer e con i for diventa un po' macchinoso raccapezzarcisi.
    Probabilmente è meglio che tu mostri il codice che hai scritto per capire dove sbagli ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da shodan
    L'errore può essere in fase di adattamento. Se mostri il codice adattato si può capire cosa lo da.
    Poi se non ho capito male, il protocollo prevede 4 bytes in testa + un buffer.
    Altri interi nel buffer li inserisci come faresti con una normale stringa, con sprintf() o itoa().
    L'adattamento attualmente consiste, in sostanza, nel posizionare i 4 bytes in coda:

    codice:
    ...
    int variabile=0;
    char temp[BUFFER_SIZE];
    char* pvar = (char*) &variabile;
    
    sprintf(temp,"%c%c",tmp1,tmp2);
    for (i=0; i<4; i++) temp[strlen(temp)+i] = pvar[i];
    printf("\n%d",strlen(temp));
    ...
    EDIT: Ho risolto proprio ora riguardando il codice. Tuttavia la lunghezza di temp al printf è pari a 2 quando mi sarei aspettato 6 (2 in quanto int variabile = 0, nel caso variabile = 1 la lunghezza arriva 3)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Se vuoi inserirei in un buffer dei valori in binario, non puoi gestirli con la strlen perché non stiamo parlando di stringhe.

    Quello che ti serve è semplicemente

    codice:
    memcpy(buffer, &tmp1, 1);
    memcpy(buffer+1, &tmp2, 1);
    memcpy(buffer+2, &variable, 4);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    Se vuoi inserirei in un buffer dei valori in binario, non puoi gestirli con la strlen perché non stiamo parlando di stringhe.

    Quello che ti serve è semplicemente

    codice:
    memcpy(buffer, &tmp1, 1);
    memcpy(buffer+1, &tmp2, 1);
    memcpy(buffer+2, &variable, 4);
    Non ci avevo pensato; domani con calma provo questa soluzione. ci sarà un po' da raccapezzarsi con la lunghezza dell'header e il conseguente parametro dimensione della send.

    Per ora ringrazio entrambi per il vostro aiuto!!

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.