PDA

View Full Version : [c++]chiarificazione char e *BYTE


okay
02-08-2006, 14:49
allora devo avere una chiarificazione riguardo a char e *BYTE

un char è un insieme di byte dove char[1] è = 1 byte ovvero 8 bit... ok

sto sviluppando con winsock e invio per ora delle stringhe tipo:

char buf[512]="invio della stringa";
send(client[i].clientSocket,buf,(int)strlen(buf),0);
o anche
send(client[i].clientSocket,buf, sizeof(buf),0);

con questo sopra invio una sequenza di byte contenuti nel char buf... ok

ho sviluppato con Directplay e c'è una funzione che è:
DPN_BUFFER_DESC è un typedef della lib di directplay

nel mio programma sviluppato invece per winsock non posso usare questo typedef e vorrei fare una cosa simile per l'invio dei dati tramite winsock.

perchè dico questo perchè non devo inviare stringhe di char (cosa che ho fatto per provare il winsock) ma nell'invio dei dati in quell'unico send devo inviare una struttura tipo:

il dato inviato deve contenere il nome del player + una struttura che ne so per esempio la posizione di una matrice e anche altri dati.

con directplay si usa inviare dati così:

GAMEMSG_OKAY msgOkay;
msgOkay.idN = pMsg->idN; //numero id del player
lstrcpy( msgOkay.nome, pMsg->nome ); //nome del player
t_bikeData data; //struttura dati (float delle posizioni delle ruote)
msgOkay.Data = pMsg->Data; //posizioni delle ruote

DPN_BUFFER_DESC bufferDesc;
bufferDesc.dwBufferSize = sizeof(GAMEMSG_OKAY);
bufferDesc.pBufferData = (BYTE*) &msgOkay;
//invio dati
g_pDPClient->Send( &bufferDesc,...

ora tornando alla classica stringa da inviare con il winsock:

char buf[512]="invio della stringa";
send(client[i].clientSocket,buf,(int)strlen(buf),0);

ecco con questo sopra invio la stringa "invio della stringa"

mentre a me servirebbe sapere come eseguire il procedimento delle Directplay per il winsock così da inviare dati come BYTE e non char in quanto non devo appunto inviare solo una stringa di char

spero di essermi spiegato.

okay
02-08-2006, 14:57
ho fatto delle prove per ora mi rispondo da solo... ma devo verificare:

buf = (BYTE*) &msgOkay; //struttura dati non arbitrari
send ((SOCKET), &buf, sizeof(GAMEMSG_OKAY), 0))

... vediamo

Marco Giunio Silano
02-08-2006, 15:05
char, BYTE.... ma qual'è il tuo dubbio che non ho capito?

Marco Giunio Silano
02-08-2006, 15:07
un char è un insieme di byte dove char[1] è = 1 byte ovvero 8 bit... ok



:what:

andbin
02-08-2006, 15:11
Nota, in Win32, BYTE è un typedef per unsigned char. Quindi, a parte la questione del segno, un BYTE è un char.

Puoi fare senza problemi:
GAMEMSG_OKAY gmo;
...
send (socket, (const char*) &gmo, sizeof(GAMEMSG_OKAY), 0);

Marco Giunio Silano
02-08-2006, 15:13
char buf[512]="invio della stringa";

send(client[i].clientSocket,buf,(int)strlen(buf),0);
o anche
send(client[i].clientSocket,buf, sizeof(buf),0);



bè, non è proprio la stessa cosa... uno è la lunghezza della stringa, l'altro la dimensione...

okay
02-08-2006, 15:15
Nota, in Win32, BYTE è un typedef per unsigned char. Quindi, a parte la questione del segno, un BYTE è un char.

Puoi fare senza problemi:
GAMEMSG_OKAY gmo;
...
send (socket, (const char*) &gmo, sizeof(GAMEMSG_OKAY), 0);


guarda ho fatto così ...


DWORD dwBuffer;
GAMEMSG_OKAY msgOkay;
msgOkay.dwType = GAME_MSGID_OKAYIT;
msgOkay.idN = idN;
dwBuffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, &dwBuffer, sizeof(GAMEMSG_OKAY), 0);


...sto provando ma ho errori cmq ci dovrei essere.

grazie adesso integro il tuo code in attesa del giudizio per quello sopra...

Marco Giunio Silano
02-08-2006, 15:16
un char è un insieme di byte dove char[1] è = 1 byte ovvero 8 bit... ok



char, BYTE, è sempre la stessa cosa e non c'è bisogno che sposti la struttura in un buffer, fai un cast della struttura passandogli l'indirizzo e il sizeof della struttura

Marco Giunio Silano
02-08-2006, 15:19
DWORD dwBuffer;
GAMEMSG_OKAY msgOkay;
msgOkay.dwType = GAME_MSGID_OKAYIT;
msgOkay.idN = idN;
dwBuffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, &dwBuffer, sizeof(GAMEMSG_OKAY), 0);

Marco Giunio Silano
02-08-2006, 15:22
guarda ho fatto così ...


DWORD dwBuffer;
GAMEMSG_OKAY msgOkay;
msgOkay.dwType = GAME_MSGID_OKAYIT;
msgOkay.idN = idN;
dwBuffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, &dwBuffer, sizeof(GAMEMSG_OKAY), 0);


...sto provando ma ho errori cmq ci dovrei essere.

grazie adesso integro il tuo code in attesa del giudizio per quello sopra...

perché nong uradi Okay che te l'ha fatto in una riga?

okay
02-08-2006, 15:45
perché nong uradi Okay che te l'ha fatto in una riga?


si infatti và bene...l'avevo visto:


GAMEMSG_OKAY msgOkay;
msgOkay.dwType = GAME_MSGID_OKAYIT;
msgOkay.idN = idN;
send (client[i].clientSocket, (const char*) &msgOkay, sizeof(GAMEMSG_OKAY), 0);


grande grazie

okay
02-08-2006, 15:54
volevo provare una cosa così ma non và:

BYTE* Buffer;
Buffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, &Buffer, sizeof(GAMEMSG_OKAY), 0);

solo per curiosità...

così invece va bene:

BYTE* Buffer;
Buffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, (const char*) &Buffer, sizeof(GAMEMSG_OKAY), 0);
... sempre (const char*) bisogna mettere


mentre in DP si usa:
g_pDPServer->SendTo( DPNID_ALL_PLAYERS_GROUP, &bufferDesc
... senza il (const char*)

probabilmente perchè &bufferDesc proviene dal typedef della lib delle DirectPlay



và bhe...! se non posso togliere il (const char*)... pazienza

okay
02-08-2006, 16:26
ora stavo provando la ricezione del const char*:


int bytes;
bytes = recv(client[i].clientSocket, (const char*) &msgOkay, sizeof(GAMEMSG_OKAY), 0);
if( (&msgOkay < sizeof(GAMEMSG_GENERIC) )
break;
GAMEMSG_GENERIC* pMsg = (GAMEMSG_GENERIC*) &msgOkay;
if( pMsg->dwType == GAME_MSGID_OKAYIT ){

}



come fare per riprendere i byte nella ricezione e gestirli??


ho fatto così e compila bene:

char* rec;
int bytes;
bytes = recv(client[i].clientSocket, rec, sizeof(GAMEMSG_OKAY), 0);
if( (sizeof(rec)) < sizeof(GAMEMSG_GENERIC) )
break;
GAMEMSG_GENERIC* pMsg = (GAMEMSG_GENERIC*) &msgOkay;
if( pMsg->dwType == GAME_MSGID_OKAYIT ){

}


che ne pensate???

Marco Giunio Silano
02-08-2006, 16:46
bè, che compila non significa che sia giusto. non ho sottomano nulla, com'è il propotipo della funzione?

andbin
02-08-2006, 17:02
volevo provare una cosa così ma non và:

BYTE* Buffer;
Buffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, &Buffer, sizeof(GAMEMSG_OKAY), 0);

solo per curiosità...

così invece va bene:

BYTE* Buffer;
Buffer = (BYTE*) &msgOkay;
send (client[i].clientSocket, (const char*) &Buffer, sizeof(GAMEMSG_OKAY), 0);
... sempre (const char*) bisogna mettereNessuna delle 2 va bene!!! In Buffer metti l'indirizzo della struttura (e fin qui ok) ma poi alla send passi l'indirizzo di Buffer! Che è sbagliato, devi passare il contenuto di Buffer che è l'indirizzo della struttura!

Quindi al massimo puoi fare:

send (client[i].clientSocket, (const char*) Buffer, sizeof(GAMEMSG_OKAY), 0);

senza &!!

In ogni caso puoi anche evitare di passare per un BYTE*. ;)

okay
02-08-2006, 17:17
Nessuna delle 2 va bene!!! In Buffer metti l'indirizzo della struttura (e fin qui ok) ma poi alla send passi l'indirizzo di Buffer! Che è sbagliato, devi passare il contenuto di Buffer che è l'indirizzo della struttura!

Quindi al massimo puoi fare:

send (client[i].clientSocket, (const char*) Buffer, sizeof(GAMEMSG_OKAY), 0);

senza &!!

In ogni caso puoi anche evitare di passare per un BYTE*. ;)


si andbin è giusto come dici.... infatti il send è OK.

adesso invece per la recv:

Non ho errori di compilazione ma ho un errore quà:
if( pMsg->dwType == GAME_MSGID_OKAYIT ){

se mi aiuti forse ci riesco il problema non è di codice ma di struttura dunque per la ricezione di quella const char* benedetta inviata (i dati inviati sono giusti idN = 0 e mess = "okay")

ricezione:


char *rec;
int bytes;
bytes = recv((SOCKET)wParam, rec, sizeof(GAMEMSG_OKAY), 0);
if( (sizeof(rec)) < sizeof(GAMEMSG_GENERIC) )
return TRUE;


GAMEMSG_GENERIC* pMsg = (GAMEMSG_GENERIC*) sizeof(rec);

if( pMsg->dwType == GAME_MSGID_OKAYIT ){
if( (sizeof(rec)) != sizeof(GAMEMSG_OKAY) )
return TRUE;

GAMEMSG_OKAY* pMsg = (GAMEMSG_OKAY*) sizeof(rec);

idN = pMsg->idN; //recupero i dati della struct
lstrcpy(NomePlayer, pMsg->mess);//nome player "okay" per provare
}


ho cambiato con
char rec[512];

ma ho l'errore in quell'if

ora faccio altre prove

okay
02-08-2006, 17:27
primo errore corretto:

char rec[512];
e
GAMEMSG_GENERIC* pMsg = (GAMEMSG_GENERIC*) &rec;


L' ULTIMO ERRORE da correggere è:
if( (sizeof(rec)) != sizeof(GAMEMSG_OKAY) )

cioè non è un errore ma esce dall'if

okay
02-08-2006, 17:46
funziona tutto
però ho dovuto togliere il controllo se la dimensione è uguale alla struttura questo per i malintezionati che con un tool o telnettando si posso loggare conoscendo la porta e l'ip e inviare dei dati fasulli facendo collassare il server.

quindi mettendo che i dati arrivati corrispondono ai dati della struttura, accetta la rec, se non esci.

if( (sizeof(rec)) < sizeof(GAMEMSG_GENERIC) )
return TRUE;

questo sopra passa

if( (sizeof(rec)) != sizeof(GAMEMSG_OKAY) )
return TRUE;

questo sopra non passa ed esce... strano

se commento questo
// if( (sizeof(rec)) != sizeof(GAMEMSG_OKAY) )
// return TRUE;

idN = pMsg->idN;
lstrcpy(NomePlayer, pMsg->mess);
E' PERFETTO idN=0 e mess="okay"

anche

if( pMsg->dwType == GAME_MSGID_OKAYIT )

vale 10 come la define GAME_MSGID_OKAYIT

okay
02-08-2006, 17:51
Che coglione

l'avevo pure messa per usarla e invece come al solito......... :doh:

corretto:

int bytes;
bytes = recv((SOCKET)wParam, rec, sizeof(GAMEMSG_OKAY), 0);
if( (bytes) < sizeof(GAMEMSG_GENERIC) )
...
if( (bytes) != sizeof(GAMEMSG_OKAY) )

ora è okay

grazie amici