Ti mando la parte riguardante questo bug
Server:
user->data.hdr.len=2; //2 in quanto per ipotesi MaxHistMsgs non sarà mai >126 (per come è stato implementato il client)
user->data.buf=malloc(sizeof(char)*2);
int dim;
if(chiede->len >= MaxHistMsgs) dim=MaxHistMsgs; else dim=chiede->len; //segno i messaggi pendenti
user->data.buf[0]=(char)dim; //dim in ASCII
user->data.buf[1]='\0'; //carattere di fine stringa anche se è solo un carattere
user->hdr.op=OP_OK;
lock_acquire(&key[n]);
err=sendMsg(c_sk,user);
lock_release(&key[n]);
Client (non modificabile dato dal professore):
if (readData(connfd, &msg.data) <= 0) {
perror("reply data");
return -1;
}
// numero di messaggi che devo ricevere
size_t nmsgs = *(size_t*)(msg.data.buf);
char *FILENAMES[nmsgs]; // NOTA: si suppone che nmsgs non sia molto grande
size_t nfiles=0;
readData:
data->buf=malloc(sizeof(char)*dim);
while(dim>0){ //leggo messaggio
fatto=read((int)fd,data->buf,dim);
if(fatto<=0){
if(errno==EINTR){
continue;
}
return fatto;
}
dim-=fatto;
}
sendMsg:
while(dim>0){ //mando il messaggio
fatto=write((int)fd,msg->buf,dim);
if(fatto==-1){
if(errno==EINTR){
continue;
}
return -1;
}
dim-=fatto;
}
send e read data devono essere generali per qualsiasi cosa da inviare la dim la passo sempre come un carattere ASCII (per avere la lunghezza da leggere per ogni "porzione" della socket)