MultiSocket - Problem!
-
Hallo!
ich will einen kleinen Chat bauen, scheitere aber schon am Control-Server.
Ich verwende zum Multiplexen select(). Es wird korrekt nach accept() ein neuer Socket erstellt, zum testen nehme ich Port 80 und als Client Firefox.
Der Aufruf von recv bringt nur leider immer einen Fehler 10057... Obwohl ich ein fd_set auf lesen prüfe und der Socket erstellt wurde... ??
Das ist der relevante Code:
// Attribute: fd_set sockets; fd_set read_sockets; int sock_list[MAX_CONN]; sockaddr_in addr; int high_sock, maxloop, count; // aus der Klasse bool tcp_server::accept() { read_sockets = sockets; int i, count = select(high_sock + 1, &read_sockets, 0, 0, 0); int sizeofaddr = sizeof(addr); if(FD_ISSET(sock_list[0], &read_sockets)) { for(i = 0; i <= MAX_CONN; i++) { if(sock_list[i] == -1) { sock_list[i] = ::accept(sock_list[0], (sockaddr*) &addr, &sizeofaddr); break; } } maxloop = i; if(count == MAX_CONN) throw out_of_clients(); if(sock_list[i] > high_sock) high_sock = sock_list[i]; FD_SET(sock_list[i], &sockets); return true; } return false; } int tcp_server::recv(std::string &buf) { int ret; for(int j = 0; j <= maxloop; j++) { if(sock_list[j] == -1) { continue; } if(FD_ISSET(sock_list[j], &read_sockets)) { cout << "Socket: " << sock_list[j] << endl; char buffer[MAX_RECV + 1]; memset(buffer, 0, MAX_RECV + 1); ret = ::recv(sock_list[j], buffer, MAX_RECV, 0); if(ret != SOCKET_ERROR) { buf = buffer; cout << "Nachricht empfangen: " << buf << endl; } else { cout << WSAGetLastError() << endl; // Zack: Ausgabe } if(buf == "quit") { ::closesocket(sock_list[j]); FD_CLR(sock_list[j], &sockets); sock_list[j] = -1; cout << "Ein Client hat sich beendet." << endl; } } if(--count <= 0) break; } return ret; } // Hauptprogramm: #include <iostream> #include <string> #include "tcp_server.hpp" using namespace std; using namespace netio; int main() { unsigned short port; string buf; cin >> port; tcp_server s; s.bind(port); s.listen(); for(;;) { if(s.accept()) s.recv(buf); } return 0; }Woran kann das liegen?
-
es liegt daran, dass dein code vollkommen falsch ist, und du versuchst vom listen-socket zu lesen. was nicht geht, da der nicht verbunden ist.
-
Hupps, wieso habe ich den listen_sock in das Array gepacket? Danke, hustbaer, aber "vollkommen falsch" ist doch etwas übertrieben.
Jetzt geht's, ich bekomme den Request von Firefox.