C++ Konsolenchat
-
Warum willst du denn so viele globale Variablen verwenden?
-
Die haben doch den Vorteil, dass man von überall darauf Zugriff hat!
-
Die haben doch den
VorteilNachteil, dass man von überall darauf Zugriff hat!
-
-
das mach ich erst einmal immer. sprich bevor der code fertig ist. zur übersichtlichkeit
-
An globalen Variablen ist nichts übersichtlich, ich würde eher sagen im Gegenteil.
-
da bin ich anderer Meinung
is ja auch jedem selbst überlassen wie er es für übersichtlich hält
-
Nicht ohne Grund sind sie verpönt
Wenn du irgendwo auf einen Namen zugreifst, der im momentanen Scope nicht vorhanden ist, frage ich mich zumindest mal, wo das Ding herkommt. Ich denke ich bin da nicht alleine.Wo gewinnst du denn dadurch Übersicht?
-
Grundsätzlicher Rat: Definiere eine Variable so nahe wie möglich an der Nutzung und immer im engsten Scope der möglich ist.
Globale Variablen sprechen gegen beide Prämissen!
-
Ok werd ich mir merken.
Ich werd mal probiern beim Client das '\0' mit zu verschicken
-
So ich hab jetzt mal bisschen was um geschrieben leider funktioniert es immer noch nicht
Client
//------------------------------------------------------------------------------ #include <iostream> #include <windows.h> #include <winsock2.h> #include <conio.h> #include <string> //------------------------------------------------------------------------------ using namespace std; int wsastart(void); int main() { /* ################################################################################ VARIABLEN ################################################################################ */ int s; struct sockaddr_in addr; long rc; string sbuf; char c; int i; //############################################################################## /* ################################################################################ SOCKET INITIALISIERUNG & VERBINDUNGSAUFBAU ################################################################################ */ rc=wsastart(); if (rc!=0) { cout << "Fehler beim Erstellen des Sockets"; getch(); return 0; } s = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_port = htons(1337); rc=connect(s,(SOCKADDR*)&addr, sizeof(sockaddr_in)); if (rc!=0) { cout << "Fehler beim Verbinden!"; getch(); return 0; } //############################################################################## /* ################################################################################ VERSENDEN VON STRINGS STÜCKCHENWEISE ################################################################################ */ cout << "Nachricht: "; cin >> sbuf; do { sbuf[sbuf.length()+1]='\0'; for (i = 0; i < sizeof(sbuf); i++) { c=sbuf[i]; rc=send(s, &c, 1, 0); if (rc==-1) { printf("\nSend ist fehlgeschlagen!"); getch(); return 0; } } cout << "Nachricht: "; cin >> sbuf; }while (sbuf!="/quit"); //############################################################################## return 0; } int wsastart() { WSADATA wsa; return WSAStartup(MAKEWORD(2,2),&wsa); }
Der Server
#include <windows.h> #include <winsock2.h> #include <iostream> #include <conio.h> #include <string> #include <stdio.h> int wsastart(void); int main() { /* ################################################################################ VARIABLEN ################################################################################ */ int rc; int s1; int s2; struct sockaddr_in addr; std::string smessage; //############################################################################## /* ################################################################################ SOCKET INITIALISIERUNG & WARTEN AUF CLIENT ################################################################################ */ rc=wsastart(); if (rc!=0) { std::cout << "Fehler beim starten des Winsocks!\n"; } //------------------------------------------------------------------------------ s1=socket(AF_INET,SOCK_STREAM,0); addr.sin_family = AF_INET; addr.sin_addr.s_addr = ADDR_ANY; addr.sin_port = htons(1337); //------------------------------------------------------------------------------ rc=bind(s1, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); if (rc!=0) { std::cout << "Fehler mit bind() :" << WSAGetLastError() << std::endl; } rc=listen(s1, 1); if (rc!=0) { std::cout << "Fehler mit listen() :" << WSAGetLastError() << std::endl; } //############################################################################## /* ################################################################################ VERBINDUNG ANNEHMEN & EMPFANGEN VON STRINGS STÜCKCHENWEISE ################################################################################ */ s2=accept(s1, NULL, NULL); if (s2==-1) { std::cout << "client nicht verbunden!"; } smessage=""; do { bool nc=false; int i=0; char c; do { recv(s2, &c, 1, 0); smessage[i]=c; if (smessage[i]=='\0') { nc=true; } i++; }while(nc!=true); std::cout << smessage; }while( smessage!="/close"); //############################################################################## return 0; } int wsastart() { WSADATA wsa; return WSAStartup(MAKEWORD(2,2), &wsa); }
Vielleicht hat noch einer ne Idee
-
Ich gehe hier mal nun auf den Client ein, denn dein Code ist schrecklich. Ich empfehle dir, eine Socketklasse zu erstellen, außerdem solltest du bei Fehlern eine Exception schmeißen. Das macht dein Programm viel besser wartbar.
Hier mal ein Vorschlag. Habs mit Absicht simpel gehalten. Die main-Funktion hab ich mal großzügig weggelassen.
namespace luggashatsgemacht { struct SocketError : std::runtime_error { SocketError(const std::string& msg) : std::runtime_error(msg) {} }; struct WSAGuard { WSAData wsa; bool success; void dummy(){} public: typedef void (WSAGuard::* bool_type) (); WSAGuard() { success = !WSAStartup(MAKEWORD(2, 2), &wsa); } operator bool_type() { return success ? &WSAGuard::dummy : 0; } ~WSAGuard() { WSACleanup(); } }; class Socket { int sockfd; static WSAGuard::bool_type guard(); Socket(const std::string& host, unsigned short port); ~Socket(); std::string read(); void write(const std::string&); }; }
luggashatsgemacht::WSAGuard::bool_type luggashatsgemacht::guard() { static WSAGuard guard; return guard; } luggashatsgemacht::Socket::Socket(const std::string& ip, unsigned short port) { if(!guard()) throw SocketError("winsock couldn't be initialized!"); if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) throw SocketError("socket couldn't be created!"); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip.c_str()); addr.sin_port = htons(port); if(connect(sockfd, reinterpret_cast<SOCKADDR*>(&addr), sizeof(addr)) throw SocketError("failed to connect!"); } luggashatsgemacht::Socket::~Socket() { closesocket(sockfd); } std::string luggashatsgemacht::Socket::read() { char buf[256]; int n = recv(sockfd, buf, sizeof(buf) - 1, 0); if(n == -1) throw SocketError("failed to read from socket!"); return std::string(buf, buf + n); } void luggashastgemacht::Socket::write(const std::string& s) { if(send(sockfd, s.c_str(), s.size(), 0) == -1) throw SocketError("failed to write to socket!"); }
Selbstverständlich ohne Gewähr und ungetestet. Meiner Meinung nach wäre es aber am einfachsten, direkt boost::asio zu verwenden.
-
Hallo schau mal hier das sollte dir helfen:
-
Danke erstmal für die beiden Antworten.
Wobei ich noch nie mit der boost lib gearbeitet habe werd ich erst mal über den Rückgabewert von recv() gehen ^^