Volevo provare a scrivere un programma x messaggiare.
Dato che mi interessa più il ragionamento del risultato ho optato per usare i file (al posto dei socket), che sono più semplici da manipolare e non richiedono librerie/funzioni particolari.
Ho appena iniziato a buttar giù qualcosa e ovviamente niente funziona a dovere, ma quello che mi preme di più adesso e' trovare il modo di catturare gli eventi da tastiera senza dover "fermare" il ciclo principale.
Il problema della GetAsyncKeyState() e' che la finestra del programma rileva la pressione di un tasto anche se e' in secondo piano (es. scrivo qualcosa sul blocco note, viene scritto anche sulla console).
E ciò mi impedisce l'utilizzo, dato che ho solo un pc in cui far girare "client" e "server" e non posso dare un comando a uno senza che lo riceva anche l'altro.
sorgente client:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#define THISFILE1
#ifdef THISFILE1
#define FILE_1 "C:\\Users\\User1\\Desktop\\chatOffline\\file1"
#define FILE_2 "C:\\Users\\User1\\Desktop\\chatOffline\\file2"
#define TIME_AGG 1
#else
#define FILE_2 "C:\\Users\\User1\\Desktop\\chatOffline\\file1"
#define FILE_1 "C:\\Users\\User1\\Desktop\\chatOffline\\file2"
#define TIME_AGG 0
#endif
typedef struct __msg
{
char data[1024];
int len;
char mittente[50];
char destinatario[50];
struct __msg* next;
} _msg;
_msg* readCom()
{
if(time(NULL)%2!=TIME_AGG) return NULL;
FILE *f;
if((f=fopen(FILE_1,"rb"))==NULL) return NULL;
if(feof(f)) return NULL;
_msg* temp=(_msg*)malloc(sizeof(_msg));
_msg* msg_head=NULL;
_msg* head=NULL;
if(fread(temp,sizeof(_msg),1,f)){
msg_head=temp;
head=msg_head;
}
else{
free(temp);
return NULL;
}
temp=(_msg*)malloc(sizeof(_msg));
while((fread(temp,sizeof(_msg),1,f))){
temp->next=NULL;
msg_head->next=temp;
msg_head=msg_head->next;
temp=(_msg*)malloc(sizeof(_msg));
}
msg_head->next=NULL;
free(temp);
remove(FILE_1);
return head;
}
int writeCom(_msg* msg)
{
while(time(NULL)%2 == (TIME_AGG+1)%2) Sleep(50);
while(time(NULL)%2 == TIME_AGG) Sleep(50);
FILE *f;
f=fopen(FILE_2,"w+b");
while(msg!=NULL){
fwrite(msg,sizeof(_msg),1,f);
msg=msg->next;
}
fclose(f);
return 0;
}
void myprint(char* buf,int len)
{
int i;
for(i=0;i<len;i++){
printf("%c", buf[i]);
}
return;
}
int printMsg(_msg* msg)
{
printf("\n messaggi in arrivo:\n");
while(msg!=NULL){
printf("Mittente: %s", msg->mittente);
printf("\nDestinatario: %s", msg->destinatario);
printf("\nMessaggio: ");
myprint(msg->data,msg->len);
printf("//////////////////////////////////\n");
msg=msg->next;
}
printf("\n fine messaggi in arrivo\n");
return 0;
}
bool mygetchar(char *buf, int &indice)
{
int i;
bool isKey=0;
bool isMaiusc=0;
if(GetAsyncKeyState(VK_SHIFT)){
isMaiusc=1;
}
for(i=0x30;i<0x5b;i++){
if(GetAsyncKeyState(i)){
if(isMaiusc)
buf[indice]=i;
else
buf[indice]=i-'A'+'a';
indice++;
isKey=1;
}
}
if(GetAsyncKeyState(VK_BACK)){
indice--;
isKey=1;
}
if(GetAsyncKeyState(VK_SPACE)){
buf[indice]=' ';
indice++;
isKey=1;
}
if(GetAsyncKeyState(VK_RETURN)){
buf[indice]='\n';
indice++;
isKey=1;
}
if(isKey){
system("cls");
myprint(buf,indice);
}
}
int main()
{
char *buf=new char[500];
_msg* msgWrite=new _msg;
_msg* msgRead=NULL;
int i;
for(i=0;i<0xdf;i++)
GetAsyncKeyState(i);
int indice=0;
while(1){
mygetchar(buf,indice);
if(GetAsyncKeyState(VK_TAB)){
strcpy(msgWrite->data,buf);
msgWrite->len=indice;
strcpy(msgWrite->mittente,"Ale\0");
strcpy(msgWrite->destinatario,"Ehm...\0");
msgWrite->next=NULL;
writeCom(msgWrite);
system("cls");
printf("\n Stringa inserita: ");
myprint(buf,indice);
indice=0;
}
if((msgRead=readCom())!=NULL){
printf("\n\n");
printMsg(msgRead);
system("pause");
}
Sleep(130);
}
return 0;
}