|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
[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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
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 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
char, BYTE.... ma qual'è il tuo dubbio che non ho capito?
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Nota, in Win32, BYTE è un typedef per unsigned char. Quindi, a parte la questione del segno, un BYTE è un char.
Puoi fare senza problemi: Codice:
GAMEMSG_OKAY gmo; ... send (socket, (const char*) &gmo, sizeof(GAMEMSG_OKAY), 0);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
guarda ho fatto così ... Codice HTML:
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);
grazie adesso integro il tuo code in attesa del giudizio per quello sopra... |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
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);
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
si infatti và bene...l'avevo visto: Codice HTML:
GAMEMSG_OKAY msgOkay;
msgOkay.dwType = GAME_MSGID_OKAYIT;
msgOkay.idN = idN;
send (client[i].clientSocket, (const char*) &msgOkay, sizeof(GAMEMSG_OKAY), 0);
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
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 Ultima modifica di okay : 02-08-2006 alle 16:07. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
ora stavo provando la ricezione del const char*:
Codice HTML:
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 ){
}
ho fatto così e compila bene: Codice HTML:
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 ){
}
Ultima modifica di okay : 02-08-2006 alle 16:30. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
bè, che compila non significa che sia giusto. non ho sottomano nulla, com'è il propotipo della funzione?
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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*.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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: Codice HTML:
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
}
char rec[512]; ma ho l'errore in quell'if ora faccio altre prove |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
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 Ultima modifica di okay : 02-08-2006 alle 17:29. |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
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 |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Che coglione
l'avevo pure messa per usarla e invece come al solito......... 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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:06.



















