PDA

Visualizza la versione completa : [C] Problema di invio di stringhe tramite socket su MacOS


Neptune
16-11-2011, 19:23
Salve a tutti,
ho un problema un pochino strano, dico così perchè il sorgente chi l'ha scritto sotto Windows non ha problemi, io che proseguio sotto MacOS invece lo rilevo.

Praticamente si parla di due progetti fatti su Eclipse (E compilato sotto windows con mingw e sotto MacOS con il compilatore suo) che si scambiano dei messaggi tramite socket tcp.

Quando il client si trova a dover leggere una stringa con spazi succede in poche parole che non legge la stringa, non me la chiede nemmeno, ed in un if di controllo lato server invece mi entra in un if che praticamente mi dice che la recv() mi restituisce -1 ovvero ha problemi con la ricezione (quando in realtà ancora non ho scritto nulla da inviarli).

Credo che sia un problema riguardante alla lettura della stringa in quanto me la invia senza manco scriverla. E credo che sotto windows tale lettura venga trattata diversamente ed ecco perchè il collega non ha problemi.

La parte di codice incriminata lato client è questa: Da notare che "Inserisci ecc ecc" appare a schermo, ma poi ho fatto varie prove sia con fgets che con gets ma non si ferma a leggere la scritta prosegue direttamente fino all'invio.



printf("\nInserisci la prima operazione da compiere \n");
//fflush(stdin);//svuta stdin
//fgets( inputString, 80, stdin);
gets( inputString);
inputString[strlen(inputString)-1] = '\0';//rimuovi lo/n finale

//splitta la stringa letta
//e riempi la struttura del messaggio
struct{
int n1;
int n2;
char op[10];
}msg;

int numeri[2];
int i=0;
char *token;
char *x="A";
token = strtok(inputString, " ");
//avvaloro il capo op di msg
strcpy(msg.op,token);

//printf("%s",msg.op);
while (token != NULL){
//printf("The token is: %s\n", token);
token = strtok(NULL," ");
numeri[i]=atoi(token);//converti ad int
i++;
}



//avvaloro i restanti campi della struct
msg.n1=numeri[0];
msg.n2=numeri[1];
printf("\ninvio di %s, %d, %d", msg.op,msg.n1,msg.n2);

//conversione da architettura dell'host a quella di rete
msg.n1=htonl(msg.n1);
msg.n2=htonl(msg.n2);


if (send(Csocket, &msg, sizeof(msg), 0) <=0) {
ErrorHandler("\nsend() sent a different number of bytes than expected\n");
closesocket(Csocket);
ClearWinSock();
system("PAUSE");//per far vedere la schermata ed il messaggio di errore
return -1;
}


Lato server invece è questo il codice che riceve:


struct{
int n1;
int n2;
char op[10];
} msg;
int ricevuto;
if ((ricevuto = recv(clientSocket, &msg, sizeof(msg), 0)) <= 0) {
ErrorHandler("recv() failed or connection closed prematurely");
closesocket(MySocket);
ClearWinSock();
system("PAUSE");//per far vedere la schermata ed il messaggio di errore
return -1;
}


Tra le varie prove se nell'if al posto di "<=" metto solo il minore stretto il programma lato server procede ma ricevendo "caratteri a cavolo" dalla memoria. Probabilmente non avvalora in nessun modo "msg" .

Quello che mi chiedo è come mai il server prosegue cosi? il client gli invia qualcosa pur non soffermandosi sulla gets o fgets? che poi sotto windows funge tutto e sotto MacOs no? Come risolvo?

Vi ringrazio in anticipo,
Neptune.

Neptune
16-11-2011, 19:41
Ho provato anche a sostituire la fflush() con:



while(getchar() != '\n');//svuota stdin


Ora lato client mi richiede di leggere la scritta ma dopo aver scritto la stringa e cliccato invio comunque il server si termina su quello stesso if riscontrando un errore nella ricezione.

Edit: facendo un pò di debug pare che la scritta da tastiera la legga correttamente, peccato che poi il server da errore nella ricezione.

oregon
16-11-2011, 20:15
Prima di tutto non scrivere più "avvalora" al posto di "valorizza" perché sono concetti completamente diversi. Avvalora è un verbo che non ha niente a che vedere con quello che pensi tu.

Detto questo, parlavi di errori in ricezione ... ovvero, hai dei messaggi particolari? Mostrali ...

MacApp
17-11-2011, 01:30
Originariamente inviato da Neptune
che poi sotto windows funge tutto e sotto MacOs no?

è un'anomalia in effetti ;-)

Loading