View Full Version : [c++]chiarificazione char e *BYTE
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.
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:
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...
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?
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
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
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?
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*. ;)
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
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
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
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.