|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
[C] Problema di invio di stringhe tramite socket su MacOS
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. Codice:
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;
}
Codice:
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;
}
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, guylmaster. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
Ho provato anche a sostituire la fflush() con:
Codice:
while(getchar() != '\n');//svuota stdin Edit: facendo un pò di debug pare che la scritta da tastiera la legga correttamente, peccato che poi il server da errore nella ricezione. Ultima modifica di guylmaster : 16-11-2011 alle 19:07. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Non ho letto il codice, così la butto la: che sia un problema di rappresentazione della "line termination"?
In Windows è un CR+LF, in MacOs è solo un LF...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:21.



















