sockets



  • Hi,

    hab folgendes problem:

    ich muss von einem client aus eine bitfolge an den server schicken. in der ersten runde kommt die bitfolge wie erwartet beim server an - in den nachfolgenden runden stimmt die bitfolge jedoch nicht mehr überein (dh. die ich mir nach dem senden auf client-seite ausgeben lasse stimmt nicht mit der bitfolge überein, die ich nach dem empfangen auf server-seite ausgeben lasse).

    versuche das problem schon den ganzen nachmittag zu lösen, komme aber nicht weiter...

    vielleicht seht ja ihr was - vielen dank im voraus!

    Hier die auszüge aus einem code:

    client-seite:

    /*while the game is active, send messages to the server*/
    	while(playing == 1){
    
    		/*Creating the message.*/
    		char *messageSend;
    		getMessage(colorSequence, message); 
    		messageSend[0] = message[0];
    		messageSend[1] = message[1];
    		messageLen = strlen(messageSend); 
    
    		/*Sending the message to the server*/	
    		if (write(clientSocket, messageSend, messageLen) != messageLen){
    			command = "Could not send the message.";
    			usage(); 
    		}
    		printf("%s","The Message for the Server: "); 
    		print16BitMessage(messageSend[0]); 
    		printf("%s","The Message for the Server: "); 
    		print16BitMessage(messageSend[1]);
    		HandleTCPServer(clientSocket); 
    
    		/*chooseColorSequence(colorSequence);*/ 
    	}
    
    void HandleTCPServer(int clientSocket){
    
    	/*Receiving the Message from the Server*/
    	char buffer[RECEIVEBUFFSIZE];
    	buffer[0] &= (char)0; 
    
    	if(read(clientSocket,buffer,RECEIVEBUFFSIZE)<0){
    		command = "Could not receive response from server.";
    		usage(); 
    	}	
    	printf("%s","Message from Server");
    	print16BitMessage(buffer[0]); 
    ....
    }
    

    server-seite:

    while(round < 5 && clientFoundSequence!=1){
    		round++;
    
    		printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr));
    		HandleTCPClient(clntSocket);
    
    		/*Getting the message for the Client*/
    		char sendMessage = messageForClient();
    		char *response;
    		response = &sendMessage;
    		int recvMsgSize = strlen(response); 
    
    		/* Echo message back to client */
    		if (write(clntSocket, response, recvMsgSize) != recvMsgSize){
    			command = "Could not send message to client.";
    			usage(); 
    		}
    		printf("%s", "Sent response to client."); 
    		print16BitMessage(*response); 
    	}
    
    void HandleTCPClient(int clntSocket){
    	char echoBuffer[RCVBUFSIZE];        /* Buffer for echo string */
    	unsigned int messageFromClient = 0; 
    	echoBuffer[0]&=(char)0;
    	echoBuffer[1]&=(char)0;
    
    	/* Receive message part 1 from client */
    	if (read(clntSocket, echoBuffer, RCVBUFSIZE) < 0){
    		command = "Could not receive message.";
    		usage(); 
    	}
    	printf("%s","Message from Client: "); 
    	print16BitMessage(echoBuffer[0]);
    	printf("%s","Message from Client: "); 
    	print16BitMessage(echoBuffer[1]);
    	messageFromClient|=echoBuffer[1];
    	messageFromClient <<=8; 
    	messageFromClient|=echoBuffer[0];
    
    	/*Getting the color Sequence*/
    	getClientsColorSequence(messageFromClient,clientColorSequence);
    }
    

    und zur sicherheit die methode mit der ich die bits ausgebe:

    void print16BitMessage(unsigned int message){
    	/*printf("%s \n","Entering printBitMessage.");*/ 
    
    	printf("%s","Least significant Bit.");
    	if(message&1){
    		printf("%d",1); 
    	}else{
    		printf("%d",0);
    	}
    
    	int i = 1; 
    	int x = 2;
    	while(i < 16){
    		/*printf("%d",x);*/
    		if(message&x){
    			printf("%d",1); 
    		}else{
    			printf("%d",0);
    		}
    		x*=2; 
    		i++;
    	}	
    	printf("%s \n","Most significant Bit.");
    }
    


  • char *messageSend;
            getMessage(colorSequence, message);
            messageSend[0] = message[0];
            messageSend[1] = message[1];
    

    Wo kommt denn da der Platz für messageSend[0] und messageSend[1] her?

    Warum schreibst du printf("%s","The Message for the Server: "); und nicht printf("The Message for the Server: "); ?
    Oder statt printf("%d",1); gleich printf("1"); oder putchar('1');

    Was soll das buffer[0] &= (char)0; ?



  • hi- danke für die antwort

    lt angabe soll man eine nachricht erzeugen, die aus 2 x 8 bit besteht - dh message ist ein char array mit der größe 2 (das hätt ich dazukopieren sollen)

    buffer[0] &= (char)0; - da hab ich nur versucht alles mit 0 zu initialisieren, weil ich vermutet habe, dass irgendwas nicht auf 0 ist und daher meine veränderten nachrichten herkommen

    lg



  • elanesse schrieb:

    lt angabe soll man eine nachricht erzeugen, die aus 2 x 8 bit besteht - dh message ist ein char array mit der größe 2 (das hätt ich dazukopieren sollen)

    Das ist dann

    char messageSend[2];
    

    Da hast du dann auch den Speicherplatz für die zwei Byte

    elanesse schrieb:

    buffer[0] &= (char)0; - da hab ich nur versucht alles mit 0 zu initialisieren, weil ich vermutet habe, dass irgendwas nicht auf 0 ist und daher meine veränderten nachrichten herkommen

    Da schreibt man ganz einfach

    buffer[0] = 0;
    

    Lies mal ein C-Buch der Reihe nach. Die Kapitel bauen aufeinander auf.



  • Das ist alles ein wenig verwirrend, was mir noch auffällt:

    print16BitMessage(buffer[0]); // buffer[0] ist char
    
    void print16BitMessage(unsigned int message)
    

    Ein char hat eigentlich nicht die gleiche Größe wie ein int. Ein char hat 8 Bit und da kann man nur schlecht(edit: sinvolle) 16 Bit auslesen. Vllt. willst du "buffer" komplett übergeben, dann solltest du dir nochmal Adress- und Zeigeroperator anschauen.

    DirkB schrieb:

    elanesse schrieb:

    buffer[0] &= (char)0; - da hab ich nur versucht alles mit 0 zu initialisieren, weil ich vermutet habe, dass irgendwas nicht auf 0 ist und daher meine veränderten nachrichten herkommen

    Da schreibt man ganz einfach

    buffer[0] = 0;
    

    Ich glaube sie wollte den ganzen Buffer mit 0 initialisieren. Da aber "read()" gnadenlos überschreibt ist es egal was innerhalb des zu überschreibenden Bereichs steht. "read()" liefert dir die Anzahl der geschriebenen Zeichen zurück und man kann damit sein Bufferende auch mit '\0' bzw 0 versehen.


Log in to reply