Sockets(Verbindungsaufbau)
-
Ich kann keine Verbindung zu meinem Lokalen Server aufbauen....
Könnt ihr mir sagen wo das Problem liegt?Client:
#include <iostream> #include <WinSock2.h> #include <Windows.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int WinsocketStarten() { // Winsocket funktionen aktivieren WSAData wsa; return WSAStartup(MAKEWORD(2, 0), &wsa); } int main() { SOCKET verbindung; SOCKADDR_IN addr; int fehlercode; fehlercode = WinsocketStarten(); if (fehlercode != 0) { cout << "Winsocket Fehler" << endl; cin.get(); return 1; } else { cout << "Winsocket wurde erstellt" << endl; } verbindung = socket(AF_INET, SOCK_STREAM, 0); if (verbindung == INVALID_SOCKET) { cout << "Socket Error" << endl; cin.get(); return 1; } else { cout << "Socket wurde erstellt" << endl; } memset(&addr, 0, sizeof(addr)); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_family = AF_INET; addr.sin_port = htons(600); fehlercode = connect(verbindung, (SOCKADDR*)&addr, sizeof(addr)); if (fehlercode == SOCKET_ERROR) { cout << "Verbindung zum Server wurde nicht aufgebaut" << endl; cin.get(); return 1; } else { cout << "Verbindung zum Server aufgebaut" << endl; } cin.get(); return 0; }Server:
#include <iostream> #include <WinSock2.h> #include <Windows.h> #include <string> #pragma comment(lib, "ws2_32.lib") using namespace std; #define MAX_CLIENTS 2 int FD_Test(const SOCKET* clients) { int zaehler = 0; // Zaehler Variable für anzahl verbundener Clients for (int i = 0; i != MAX_CLIENTS; ++i) { if (clients[i] != INVALID_SOCKET) { zaehler = zaehler + 1; } } return zaehler; // Verbundene Clients anzahl zurücgeben } int WinsocketStarten() { // Winsocket Funktionen aktivieren WSAData wsa; return WSAStartup(MAKEWORD(2, 0), &wsa); } int main() { int toClientNr = 0; // Client Nummer X int fehlercode; // Fehlercodes in diese Variable speichern SOCKET clients[MAX_CLIENTS]; // Aktuelle Clients SOCKET akzeptiere; // akzeptiere neue Verbindungen FD_SET clientsTest; // Prüfe ob eine neue Verbindung ansteht SOCKADDR_IN addr; // Server Eigenschaften speichern //----------------------------Server Eigenschaften festlegen--------------------------------------- fehlercode = WinsocketStarten(); // Winsockets aktivieren if (fehlercode != 0) { cout << "Winsocket Funktionen wurden deaktiviert..." << endl; cin.get(); return 1; } else { cout << "Winsocket Funktionen wurden aktiviert..." << endl; } akzeptiere = socket(AF_INET, SOCK_STREAM, 0); // TCP verbindungen socket if (akzeptiere == INVALID_SOCKET) { cout << "Socket erstellung fehlgeschlagen!" << endl; cin.get(); return 1; } else { cout << "Socket wurde erstellt" << endl; } memset(&addr, 0, sizeof(addr)); addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = htons(600); fehlercode = bind(akzeptiere, (SOCKADDR*)&addr, sizeof(addr)); // binde socket an port 123 if (fehlercode == SOCKET_ERROR) { cout << "Fehler beim binden des Sockets an den Port 123..." << endl; cin.get(); return 1; } else { cout << "Socket wurde an Port 123 gebunden..." << endl; cin.get(); return 1; } fehlercode = listen(akzeptiere, MAX_CLIENTS); // akzeptiere in den listen modus bringen if (fehlercode == SOCKET_ERROR) { cout << "Listen Modus(akzeptiere) fehler: " << GetLastError() << endl; cin.get(); return 1; } else { cout << "Akzeptiere befindet sich im Listen Modus..." << endl; } for (int i = 0; i != MAX_CLIENTS; ++i) { clients[i] = INVALID_SOCKET; } //---------------------------Auf Clients warten---------------------------------------------------------- while (FD_Test(clients) != MAX_CLIENTS) // Solange anzahl der Verbundenen Cients != MAX_CLIENTS ist loop ausführen { FD_ZERO(&clientsTest); FD_SET(akzeptiere, &clientsTest); // Prüfe ob verbindung getrennt wurde for (int i = 0; i != MAX_CLIENTS; ++i) { if (clients[i] == SOCKET_ERROR) { closesocket(i); clients[i] = INVALID_SOCKET; cout << "Verbindung zum Client " << i << " verloren" << endl; break; } } // Schauen ob sich etwas in clientsTest getan hat fehlercode = select(0, &clientsTest, nullptr, nullptr, nullptr); if (fehlercode == SOCKET_ERROR) { cout << "Select Auswahl fehler: " << GetLastError() << endl; cin.get(); return 1; } // Falls ein Client eine Verbindung aufnehmen möchte if (FD_ISSET(akzeptiere, &clientsTest)) { // Schaue nach einem Freien Socket for (int i = 0; i != MAX_CLIENTS; ++i) { if (clients[i] == INVALID_SOCKET) { clients[i] = accept(akzeptiere, nullptr, nullptr); break; } } } } return 0; }
-
Bist du denn selbst mit dem debugger und breakpoints durch deinen Code gesteüt?
Bissel wenig Infos.
-
Das waren alle benötigten Infos zum Programm
Der Server nimmt nur Verbindungen an
Und der Client baut nur eine Verbindung zum Server aufJa ich hab schon alles mit dem Debugger ausprobiert der Client verbindet immer noch nicht mit dem Server
Ich habe aus diesem Grund ein weiteres Programm geschrieben das auch "nur" eine Verbindung zum Server aufbaut und sich dann wieder schließt jedoch erhielt ich dort auch eine Fehlermeldung
An den Ports habe ich auch ein wenig rum gespielt, dieses brachte mich jedoch nicht weiter

-
Du erhältst also eine Fehlermeldung, meinst aber, dies verschweigen zu müssen?
-
Zeile 82 und 83 vom Server-Code stehen dir im Weg.
Edit:
Das kann man mit Step-by-Step Debugging herausfinden.
Überigens verwende ich zu Testzwecken oft Hercules, ein etwas old-fashioned Tool, welches als einfacher TCP-Server und TCP-Client agieren kann.
-
Beim Client nimmst du den Port 600 und beim Server den Port 123...
Du musst dich mit dem Port verbinden, an den der Server den Socket gebunden hat
-
Asyl-Dämon schrieb:
Beim Client nimmst du den Port 600 und beim Server den Port 123...
Du musst dich mit dem Port verbinden, an den der Server den Socket gebunden hatDa ist nur der Kommentar im Server-Code falsch... beide benutzen denselben Port.
-
theta schrieb:
Zeile 82 und 83 vom Server-Code stehen dir im Weg.
Edit:
Das kann man mit Step-by-Step Debugging herausfinden.
Überigens verwende ich zu Testzwecken oft Hercules, ein etwas old-fashioned Tool, welches als einfacher TCP-Server und TCP-Client agieren kann.Ops hab das habe ich wohl übersehen vielen Dank es funktioniert jetzt.
