Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [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;
    		}
    Lato server invece è questo il codice che riceve:
    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;
    		}
    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.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Ho provato anche a sostituire la fflush() con:

    codice:
    		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.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4

    Re: [C] Problema di invio di stringhe tramite socket su MacOS

    Originariamente inviato da Neptune
    che poi sotto windows funge tutto e sotto MacOs no?
    è un'anomalia in effetti ;-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.