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; }
-
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