Newsgroup: it.comp.programmare.win32
Titolo: Creare un pacchetto

Salve, per un mio programma ho bisogno di creare un pacchetto di
comunicazione, mi spiego:
Due software devono riconoscersi a vicenda (di cui uno è sviluppato in
C Sdk), a questo scopo voglio creare un pacchetto del tipo
IDENTIFICAVO+DATI, per ora non mi interessa un controllo di errore...A
questo modo il ricevente legge i primi tot byte del pacchetto
utilizzati per l'identificativo e se corrispondono a un certo valore o
dato (che scelgo io) allora vuol dire che si tratta del chiamante
adatto e legge i dati successivi...A livello di codice come posso
implementare questo pacchetto? Un'array di byte?Sono in difficoltà in
questo senso...

IDENTIFICAVO+DATI, per ora non mi interessa un controllo di errore...A
Lavorando in C, la cosa più intuitiva è quella di costruire una
struttura con i "metodi" che lavorano su di essa.
Parlo di "metodi" perché, pur non disponendo in C delle facilitazioni
che avresti in C++, in cui potresti costruire una classe "streamable",
puoi costruire qualcosa di molto simile.
Astraggo, nel codice che segue (scritto al volo, quindi prendilo con
le molle), le procedure di lettura/scrittura, perché le puoi
sostituire con quello che vuoi (ipotizzo che userai i socket per far
parlare le due applicazioni):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned char byte, *pbyte;
typedef struct {
        int id;
        char *first_name;
        char *last_name;        
} packet_t, *ppacket_t;
ppacket_t packet_new(void) { 
    ppacket_t self=malloc(sizeof *self);
    if (self) {
       self->first_name=0;
       self->last_name=0;      
    }
    return self;
}
void packet_delete(ppacket_t self) {
    if (self) {
       if (self->first_name) free(self->first_name);       
       if (self->last_name) free(self->last_name);
       free(self);
    }     
}
size_t packet_streamed_size(ppacket_t self) {
    size_t result=0;
    if (self) {
       result += sizeof self->id;
       result += sizeof(size_t);       
       if (self->first_name)
          result += strlen(self->first_name);
       result += sizeof(size_t);       
       if (self->last_name)
          result += strlen(self->last_name);
    }   
    return result;
}
void packet_read(ppacket_t self, pbyte from_buffer) {
    if (self && from_buffer) {
       int i, j;
       size_t len1, len2;
       for (i=0, j=0; j<sizeof self->id; i++, j++) 
         ((pbyte)&self->id)[j]=from_buffer[i];
       for (j=0; j<sizeof len1; i++, j++) 
         ((pbyte)&len1)[j]=from_buffer[i];
 
       if (len1) {
          self->first_name=calloc(len1+1, 1);
          if (self->first_name) 
            for (j=0; j<len1; i++, j++) 
              self->first_name[j]=from_buffer[i];
       }
 
       for (j=0; j<sizeof len2; i++, j++) 
         ((pbyte)&len2)[j]=from_buffer[i];       
 
       if (len2) {
          self->last_name=calloc(len2+1, 1);
          if (self->last_name) 
            for (j=0; j<len2; i++, j++) 
              self->last_name[j]=from_buffer[i];
       }         
    }      
}
void packet_write(ppacket_t self, pbyte to_buffer) {
    if (self && to_buffer) {
       int i, j;
       size_t len1=0, len2=0;
       for (i=0, j=0; j<sizeof self->id; i++, j++) 
         to_buffer[i]=((pbyte)&self->id)[j];
 
       if (self->first_name) 
         len1=strlen(self->first_name);
 
       for (j=0; j<sizeof len1; i++, j++) 
         to_buffer[i]=((pbyte)&len1)[j];
 
       if (len1)
          for (j=0; j<len1; i++, j++) 
             to_buffer[i]=self->first_name[j];
 
       if (self->last_name) 
         len2=strlen(self->last_name);              
 
       for (j=0; j<sizeof len2; i++, j++) 
         to_buffer[i]=((pbyte)&len2)[j];       
 
       if (len2)
          for (j=0; j<len2; i++, j++) 
            to_buffer[i]=self->last_name[j];
    }      
}
void packet_to_console(ppacket_t self) {
     if (self) {
        printf("id=%d\nfirst_name=\"%s\"\nlast_name=\"%s\"\n\n", 
           self->id, self->first_name, self->last_name);       
     }
}
#ifndef strdup
char *strdup(const char *s) {
     char *p=malloc(strlen(s)+1);
     if (p) strcpy(p, s);
     return p;
}
#endif
int main()
{   
    ppacket_t p1=0, p2=0;
    byte buffer[8192]={0};
    size_t i=0, packet_size=0;
 
    p1=packet_new();
    p1->id = 567;
    p1->first_name=strdup("mario");
    p1->last_name=strdup("rossi");
 
    packet_size=packet_streamed_size(p1);
    printf("(p1) streamed packet size=%d\n", packet_size);
 
    packet_write(p1, buffer);    
 
    printf("(p1) packet written: ");
    for (i=0; i<packet_size; i++) 
      printf("%x", buffer[i]);
    printf("\n\n");        
    packet_to_console(p1);    
 
    p2=packet_new();
    packet_read(p2, buffer);
 
    packet_size=packet_streamed_size(p2);
    printf("(p2) streamed packet size=%d\n", packet_size);            
 
    printf("(p2) packet read: ");
    for (i=0; i<packet_size; i++) 
      printf("%x", buffer[i]);
    printf("\n\n");   
    packet_to_console(p2);
 
    return 0;
}


Per quello che devo fare penso sia troppo complesso...io intendevo un
array di byte in cui per esempio i primi 4 byte servono per
identificazione, i seguenti 4 byte per indicare come leggere il resto
del pacchetto e il resto del pacchetto che può essere codificato come
stringa o come dato in base a quello che c'è nel campo precedente...

drav...@virgilio.it
 ha scritto:

scrivi entrambi i programmi o comunque ci sono delle restrizioni?
una named-pipe forse ...
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/pipes.asp

 una named-pipe forse ...
ehmm...mi sa che sono andato troppo avanti ;-)
scusa, di mattina presto non dovrei mai postare...comunuqe tornando a noi:
struct _tagBase
{
	UINT nID; //<-il tuo numero identificativo
	UINT nDataType;
...//varie ed eventuali
}
strust _tagTipo1
{
	_tagBase base; //<- nDataType==1
	UINT nValue1;
	double fValue2;
	...
}
struct _tagTipo2
{
	_tagBase base; //<->nDataType==2
	UINT nDataLength;
	BYTE pBuf[1];
}
struct _tagTipo3
{
	_tagBase base; //<->nDataType==3
	UINT nStringLength;
	TCHAR szBuf[1];
}
soluzione classica, semplice ma abbastanza efficacie
ciao

identificazione[...]
E' esattamente ciò che faccio io in quel codice...
Leggilo.

 Leggilo.
In verità l'ho letto ma non sono riuscito a starci molto dietro :) 

In verità l'ho letto ma non sono riuscito a starci molto dietro :) 
Appunto...