Fehler bei accept()
-
Moin Leutz!
Ich hab hier ein Problem bezüglich Sockets. wenn ich das accept() aufrufe hält mein Prog an und lässt nichts mehr mit sich machen. Ich muss es dann immer abbrechen und ich weiß nicht warum. Ich bekomm nicht mal ne Fehlermeldeung!!!
Weiterhin schreibt mir das Prog auch nichts mehr in meine Listbox. Wenn ich aber mit Haltepunkten arbeite und schritt für schritt durchgehe, dann zeigt er mir die Ausgaben an.Warum? Keine Ahnung *ratlosbin*
Hier mal der Hauptteil von meinem Code:
void MySniffer::lookforip(void) { int len = sizeof(sockaddr_in); int len2 = sizeof(sockaddr); int option_flag; //Socket wird auf Lokalen Server gebunden, bei Fehlschlag gib den Error aus if(bind(ServerSocket, (sockaddr*)&ServerSAddr, sizeof(ServerSAddr)) == SOCKET_ERROR) { Form1->ListBox1->Items->Add("Binding Socket failed: " + (AnsiString)WSAGetLastError()); return; } //Socket-Optionen werden festgelegt if(setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&option_flag, sizeof(option_flag)*2) == SOCKET_ERROR) { Form1->ListBox1->Items->Add("Setting Socket-Options failed: " + (AnsiString)WSAGetLastError()); return; } //Port wird abgehört, bei Fehlschlag gib den Error aus if(listen(ServerSocket, 5) == SOCKET_ERROR) { Form1->ListBox1->Items->Add("Listening on Socket failed: " + (AnsiString)WSAGetLastError()); return; } //Endlosschleife for(;;) { //bei Anfrage akzeptiere Verbindung ClientSocket = accept(ServerSocket, (sockaddr*)&ClientSAddr, &len); //wenn der ClientSocket nicht erstellt werden konnte gib den Error aus if(ClientSocket == INVALID_SOCKET) { Form1->ListBox1->Items->Add("Initializing Client-Socket failed: " + (AnsiString)WSAGetLastError()); break; } //Ausgabe des Remote-Hostnamens, bei Fehler gib den Error aus if(getpeername(ClientSocket, (sockaddr*)&ClientSAddr, &len2) == SOCKET_ERROR) { Form1->ListBox1->Items->Add("Getting Peername of Client-Socket failed: " + (AnsiString)WSAGetLastError()); } else { IP = inet_ntoa(ClientSAddr.sin_addr); Form1->ListBox1->Items->Add(IP); } Sleep(1000); } }
P.S. das Ganze befindet sich in einer Klasse; der ServerSocket wird in einer anderen Methode initialisiert
Ich hoffe ihr könnt mir helfen?
Danke!
-
Ich würde zum einen die Socket-Optionen vor dem Aufruf von "bind()" setzen, damit diese auch wirksam werden.
"accept()" wartet so lange (und zwar blockierend), bis ein Verbindungswunsch eines Clients eingeht.
Wenn du nicht willst, dass deine komplette Anwendung blockiert ist, dann würde ich den "accept()-Aufruf" und die nachfolgende Kommunikation in einem jeweils eigenen Thread behandeln.
-
Hey Danke für die schnelle Hilfe!
Wenn du nicht willst, dass deine komplette Anwendung blockiert ist, dann würde ich den "accept()-Aufruf" und die nachfolgende Kommunikation in einem jeweils eigenen Thread behandeln.
Dann werd ich mal versuchen das in einen Thrad zu packen, damit meine Anwendung auch weiterlaufen kann!