Sockets -> accept (die 1000.)
-
Bei "... accept(... , (SOCKADDR*) &addr, ...);" also hier
int cServer::Server_accept (void) { this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->addr, (int*)sizeof(SOCKADDR)); return this->connectedsocket; }
überschreibst Du mit Sicherheit "Die Daten an den Du Deinen Serverapplikation gebunden hast"
! Verwende diesen Parameter nur mit einer
zweitenSOCKADDR_IN clientDaten;
Struktur, den Accept legt dort
Daten von einen Clienten ab der connecten will(Zu verwenden wen Du eine Logfile zum registrieren von eingehenden Clients verwenden willst)! Du überschreibst dort nehmlich
Die Daten deiner laufenden Serverapplikation -> deswegen kommt sicherlich der
Absturz!!!!mfg
-
wegen flascher Verwendung von "SOCKADDR_IN addr;"
Deklarieren in deinen Serverobjekt Klasse wie auch immer
noch eine Struktur vom Typ "SOCKADDR_IN clientDaten;"
und aendere:int cServer::Server_accept (void) { this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->addr, (int*)sizeof(SOCKADDR)); return this->connectedsocket; }
ietwa so ab damit Du die Serverdaten nicht ueberschreibst:
int cServer::Server_accept (void) { this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->clientDaten, (int*)sizeof(SOCKADDR)); return this->connectedsocket; }
Dann sollte es nicht mehr Abstürzen!
Kommt jetzt ein connectendere Client stehen dort (bei "clientDaten")Verbindungsdaten vom Clienten
mfg
-
Hab folgende Deiner Implementierung folgendermaßen nochmal geandert und dann hat der Server
bei mir wieder gefunztint cServer::Server_accept (void) { int addrSize = sizeof(SOCKADDR); this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*) &clientDaten, (int*) &addrSize); return this->connectedsocket; }
Sorry und mfg
-
Der bzw Dein TCP-Server (Fehler bei accept behoben) und mit 2. SOCKADDR_IN - Struktur:
#include <windows.h> #include <iostream.h> #include <cstring.h> class cServer { public: inline cServer () {} inline ~cServer () { WSACleanup(); closesocket(this->acceptsocket); closesocket(this->connectedsocket); } inline SOCKET getConSocket (void) { return this->connectedsocket; } int Server_startup (void); int Server_createSock (void); int Server_bind (string port); int Server_listen (void); int Server_accept (void); private: WSADATA wsadata; SOCKET acceptsocket; SOCKET connectedsocket; SOCKADDR_IN addr, clientDaten; }; int cServer::Server_startup (void) { return WSAStartup(MAKEWORD(2,0), &this->wsadata); } int cServer::Server_createSock (void) { this->acceptsocket = socket(AF_INET, SOCK_STREAM, 0); return this->acceptsocket; } int cServer::Server_bind(string port) { memset(&this->addr, 0, sizeof(SOCKADDR_IN)); this->addr.sin_family = AF_INET; this->addr.sin_port = htons(atoi(port.c_str())); this->addr.sin_addr.s_addr = INADDR_ANY; return bind(this->acceptsocket, (SOCKADDR*)&this->addr, sizeof(SOCKADDR_IN)); } int cServer::Server_listen (void) { return listen(this->acceptsocket, 10); } int cServer::Server_accept (void) { int addrSize = sizeof(SOCKADDR); this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*) &clientDaten, (int*) &addrSize); return this->connectedsocket; } //////////////////////////////////////////////////////////////////// int main (void) { cServer myserver; long res; char buffer[255]; res = myserver.Server_startup(); if (res != 0) cout << "Server meldet: Winsock nicht gestartet!\n"; else cout << "Server meldet: Winsock erfolgreich gestartet!\n"; res = myserver.Server_createSock(); if (res != INVALID_SOCKET) cout << "Server meldet: Socket erfolgreich erstellt!\n"; else cout << "Server meldet: Socket nicht erstellt!\n"; res = myserver.Server_bind("237"); if (res != SOCKET_ERROR) cout << "Server meldet: Socket wurde an Port 237 erfolgreich gebunden!\n"; else cout << "Server meldet: Socket wurde nicht gebunden!\n"; res = myserver.Server_listen(); if (res != SOCKET_ERROR) cout << "Server meldet: Neuer Status: Server im Listen Modus...\n"; else cout << "Server meldet: Server nicht im Listen Modus!\n"; res = myserver.Server_accept(); if (res != INVALID_SOCKET) cout << "Server meldet: Neue Verbindung akzeptiert!\n"; else cout << "Server meldet: Neue Verbindung nicht akzeptiert!\n"; while(res != SOCKET_ERROR) { res = recv(myserver.getConSocket(), buffer, strlen(buffer), 0); if (res == 0) { cout << "Server hat die Verbindung getrennt.. \n"; break; } if (res == SOCKET_ERROR) { cout << "Fehler: Receive"; break; } buffer[res] = '\0'; cout << "Nachricht: " << buffer; } return(0); }
Und jetzt nochmal der TCP - Client zum testen:
#include <winsock.h> #include <stdio.h> //Prototypen int startWinsock(void); int main() { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } // Socket erstellen s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } // Verbinden memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(237); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Verbunden mit 127.0.0.1..\n"); } // Daten austauschen while(rc!=SOCKET_ERROR) { printf("\nZeichenfolge eingeben [max 256]: "); gets(buf); send(s,buf,strlen(buf),0); rc=recv(s,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(rc==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } buf[rc]='\0'; printf("\nServer antwortet: %s\n",buf); } closesocket(s); WSACleanup(); getchar(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
so funzt es bei mir, Verbindung und Nachrichtübermittlung bei dem Server klappt!
:pwenns immer noch nisch geht?
kann es sein das du rein zufällig ne bzw. die winsock2.h
includiert hast die damit gehts bei mir nisch ich verwende deshalb "winsock.h"mfg
-
Hallo!
Danke für deine Mühe
Ich hab gerade ein neues Projekt gemacht und das ganze HAAR GENAU EXAKTESTENS gleich abgeschrieben und siehe da: Es klappt net!
Das kann nicht sein! Das geht nicht..
Ich werd jetzt nochmal den neuen Code von dir probieren und hoffen dass es klappt!
Vielen Dank dass du dir die Mühe gemacht hast!!!!
mfg
-
is aus versehen geschehen aber diese Header includiert ihrer selbst
die "winsock.h" gleich mit!
Du kannst das aendern dann wird die EXE nen bisschen kleiner!
-
Hallo!
Wie erwartet, funktioniert es nicht
Der Server bleibt sofort hängen bei accept wieder mal..
naja ich weiss langsam echt nicht was da los is... am Code kanns einfach nicht liegen, weil das der selbe ist!
Trotzdem danke!!!
mfg
-
Ich habs ja bei mir mit C++ 5.0 von Boland getestet -> Ergebnis es geht anstandslos
Dann hab ichs mit Microsoft Visual C++ 6.0 getestet -> Ergebnis es geht nischt,
neben Headerfiles die er nicht findet "cstring.h" ganz zu schweigenIch nutze persöhnlich Microsoft Visual C++ aber sowieso nicht mehr
das ist etwas Nutzerunfreundlich meines erachtens!
Das soll aber keine Abwertung von Microsoft sein, nischts ist vollkommen!mfg
-
Du das kann nicht sein, dass MEIN Code nicht funktioniert aber der Code des Tutorials funktioniert..
beides ist mit VC kompiliert/gelinkt wurden!!
Der eine Code (aus dem Tutorial per c&p) funktioniert aber mein Code, der die selben Funktionen benutzt nur in einer klasse funktioniert nicht!
Erklär mir das mal
Das geht nicht!
-
Und zwar mit dem CBuilder 5.0 von Borland
und Dein Code mit der Klassenkapselung der Netzwerkfunktionen funktioniert
einwandfrei bezogen auf meinen Client und Dein Servercode!Nur VC 6.0 macht dicke Backen das is Compilerspezifisch und hat nichts unbedingt damit zu tun das der Code grundlegend falsch is!!!!!
Solche Probleme hatte ich schon des öfteren deswegen habe ich bei mir zu Hause
auch eineiges an Compilern und IDE's rumkullern! C/C++ - Compiler ist nicht
gleich C/C++ Compiler bezogen auf CODEtechnische Standards! So is nunmal das
Leben. Ich hab da schon so manches erlebt was ausser dieser Geschicht dort
funktioniert hat und auf ner anderen IDE nicht! Es gibt sogar Unterschiede
zwischen den verschiedenen Versionen von einer IDE von ein und demselben
Hersteller!!!Sumasomarum hab ich jez auf 3 verschiedenen Compilern getestet bei den
beiden Borlands klappts, und bei Visual C++ 6.0 gehts nisch! Ergo Compilerproblem!mfg
-
Ich hab jetzt den Code ausm Tutorial 1:1 übernommen und schritt für schritt in Klasse umgesetzt..
einziger Unterschied: ich benutze printf() und kein cout
Vielleicht liegts daran.. egal, es funktioniert und das ist das wichtigste +gg+
Vielen Dank jedenfalls für deine Hilfe!!!
mfg