Nachricht von Client an TCP Server wird in komischen Zeichen angezeigt :(



  • Hallo,
    ich habe ein Problem und zwar werden meine Nachrichten, die ich von meinem Client an meinen TCP Server schreibe in komischen Zeichen angezeigt. Ich habe die Vermutung, dass es sich dabei um Bytes handelt. Ich habe allerdings keine Ahnung, wie ich das beheben soll und hänge schon seit einigen Tagen daran :(.
    Das ganze habe ich in C++ mit WinSock2 geschrieben, falls es weiterhilft 😞
    Danke schonmal im voraus!

    Code, den ich verantwortlich mache:

    #include <Windows.h>
    #include <iostream>
    #include <string>
    
    #pragma comment(lib, "ws2_32.lib")
    
    using namespace std;
    
    string ToString(char ar[]);
    
    int main()
    {
    	//Variablen
    	int					iStoreVal;
    	WSADATA				wsaVersion;
    	WORD				vers = MAKEWORD(2, 2);
    
    	//Socket
    	SOCKET				serverSock = INVALID_SOCKET;
    	SOCKET				clientSock = INVALID_SOCKET;
    
    	//sockaddr
    	sockaddr_in			serverSockInfo;
    	sockaddr_in			clientSockInfo;
    
    	//int
    	int					storeServerInfoLen = sizeof(serverSockInfo);
    	int					storeClientInfoLen = sizeof(clientSockInfo);
    
    	//char*
    	char				sendBuf[] = "";
    	char				recvBuf[] = "";
    
    	//Version festlegen
    	iStoreVal = WSAStartup(vers, &wsaVersion);
    	//Check, ob es geklappt hat
    	if (iStoreVal == 0)
    	{
    		cout << "WSAStartup()\t\t\tsuccessful" << endl;
    	}
    	else
    	{
    		cout << "WSAStartup()\t\t\tfailed : " << WSAGetLastError() << endl;
    	}
    
    	serverSock = socket(AF_INET, SOCK_STREAM, 0);
    	if (serverSock != INVALID_SOCKET)
    	{
    		cout << "socket()\t\t\tsuccessful" << endl;
    	}
    	else
    	{
    		cout << "socket()\t\t\tfailed : " << WSAGetLastError() << endl;
    	}
    
    	//binden
    	serverSockInfo.sin_addr.s_addr	= inet_addr("127.0.0.24");	//IP
    	serverSockInfo.sin_family		= AF_INET;					//IPv4
    	serverSockInfo.sin_port			= htons(54345);				//Port
    
    	iStoreVal = bind(serverSock, (struct sockaddr*)&serverSockInfo, storeServerInfoLen);
    	if (iStoreVal != SOCKET_ERROR)
    	{
    		cout << "bind()\t\t\t\tsuccessful" << endl;
    	}
    	else
    	{
    		cout << "bind()\t\t\t\tfailed : " << WSAGetLastError() << endl;
    	}
    
    	//Warteschlange einrichten
    	iStoreVal = listen(serverSock, SOMAXCONN);
    	if (iStoreVal != SOCKET_ERROR)
    	{
    		cout << "listen()\t\t\tsuccessful" << endl;
    	}
    	else
    	{
    		cout << "listen()\t\t\tfailed : " << WSAGetLastError() << endl;
    	}
    
    	//Client accepten
    	while (1)
    	{
    		clientSock = accept(serverSock, (struct sockaddr*)&clientSockInfo, &storeClientInfoLen);	//accept gibt ein SOCKET zurück!!!!
    		if (clientSock != SOCKET_ERROR)
    		{
    			cout << "accept()\t\t\tsuccessful\nconnected with IP : " << inet_ntoa(clientSockInfo.sin_addr) << " : " << htons(clientSockInfo.sin_port) << endl;
    		}
    		else
    		{
    			cout << "accept()\t\t\tfailed : " << WSAGetLastError() << endl;
    		}
    
    		//entgegennehmen von Nachrichten
    		iStoreVal = recv(clientSock, recvBuf, strlen(recvBuf), 0);
    		if (iStoreVal != SOCKET_ERROR)
    		{
    			cout << endl;
    			cout << "recv()\t\t\t\tsuccessful : " << ToString(recvBuf) << endl;	//ES WERDEN BYTES AUSGEGEBEN
    			recvBuf[512] = NULL;
    		}
    		else
    		{
    			cout << "recv()\t\t\t\tfailed : " << WSAGetLastError() << endl;
    		}
    	}
    
    	//Sockets schließen
    	closesocket(clientSock);
    	closesocket(serverSock);
    	WSACleanup();
    
    	return 0;
    }
    
    string ToString(char ar[])
    {
    	string s = "";
    	for (int i = 0; i <= sizeof(ar) / sizeof(char); i++)	//sizeof(ar) / sizeof(char)
    	{
    		s += ar[i];
    	}
    	return s;
    }
    

  • Mod

    Zeile 120 ist Quatsch. Du teilst die Größe eines Zeigers durch 1. Das hat gar nichts mit der Größe des Feldes zu tun, auf die der Zeiger zeigt (und an diese Größe kannst du nicht heran kommen).

    Überhaupt bist du sehr uneinheitlich mit deinen char-Feldern. Sind die nun nullterminiert oder nicht? Mal machst du es so, mal anders. Wahrscheinlich willst du hier nirgends die char-Felder als nullterminiert betrachten. Gerade solche Dinge wie in Zeile 96 sehen höchst verdächtig aus; das strlen dürfte stets 0 ergeben.

    Aber insgesamt bräuchtest du gar nicht mit rohen Arrays herum zu hantieren. Bloß weil send und recv Zeiger auf char als Prameter erwarten, heißt das ja nicht, dass man keine std::string, std::vector oder std::array (je nach genauem Bedarf. Wahrscheinlich also vector oder array) als unterliegenden Datentyp benutzen dürfte. Damit würden deine Probleme hinsichtlich der Längenbestimmung entfallen (da alle diese Typen ihre Länge selber kennen) und vermutlich noch jede Menge andere Probleme, die ich beim Querlesen gar nicht gesehen habe.

    PS: Weitere Probleme, die ich beim Querlesen gesehen habe:
    -Zeilen 31, 32: Nein, char-Felder sind keine dynamischen Zeichenketten. Du hast hier ein paar statische Arrays der Größe 1 definiert. Das ist natürlich besonders fatal, da du später, wie im ersten Absatz erklärt, so tust als wären die Felder so lang wie ein Zeiger. Ein Zeiger ist aber in der Regel größer als 1 Byte.



  • Danke


Anmelden zum Antworten