Problem mit Server [gelöst]
-
Hallo. Also mich plagt ein Problem, dem ich nicht auf die Schliche kommen konnte. Mein Server hat eine Endlosschleife, die aber ihren Dienst nicht tut. Woran liegt das? (Das C im C++ Code sei bitte außer Acht gelassen)
#include <iostream> #include <winsock.h> #define BUFFER_SIZE 1024 using namespace std; int handling(int c) { char buffer[BUFFER_SIZE], name[BUFFER_SIZE]; int bytes; strcpy(buffer, "My name is: "); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1) return -1; bytes = recv(c, name, sizeof(name), 0); if (bytes == -1) return -1; name[bytes] = '\0'; sprintf(buffer, "Hello %s, nice to meet you!\r\n", name); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1) return -1; return 0; } int main(int argc, char *argv[]) { /* initialize windows sockets */ WSADATA wsa; if (WSAStartup(MAKEWORD(1, 1), &wsa)) { cout << "WSAStartup() failed: " << (unsigned long)GetLastError() << endl; return EXIT_FAILURE; } int s, c, cli_size; struct sockaddr_in srv, cli; if (argc != 2) { fprintf(stderr, "usage: %s port\n", argv[0]); return 1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket() failed"); return 2; } srv.sin_addr.s_addr = INADDR_ANY; srv.sin_port = htons( (unsigned short int) atol(argv[1])); srv.sin_family = AF_INET; if (bind(s, (struct sockaddr*)&srv, sizeof(srv)) == -1) { perror("bind() failed"); return 3; } if (listen(s, 3) == -1) { perror("listen() failed"); return 4; } for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT AB { c = accept(s, (struct sockaddr*)&cli, &cli_size); if (c == -1) { perror("accept() failed"); return 5; } printf("client from %s", inet_ntoa(cli.sin_addr)); if (handling(c) == -1) fprintf(stderr, "%s: handling() failed", argv[0]); /* hier empfiehlt sich kein return mehr, weil sonst der * ganze Server beendet wird wenn ein Client wegstirbt. Das ist * natürlich nicht sinnvoll. */ closesocket(c); } return 0; }
-
Warum nicht einfach
while(true) { c = accept(s, (struct sockaddr*)&cli, &cli_size); if (c == -1) { perror("accept() failed"); return 5; } printf("client from %s", inet_ntoa(cli.sin_addr)); if (handling(c) == -1) fprintf(stderr, "%s: handling() failed", argv[0]); /* hier empfiehlt sich kein return mehr, weil sonst der * ganze Server beendet wird wenn ein Client wegstirbt. Das ist * natürlich nicht sinnvoll. */ closesocket(c); }Gruß eXitus
-
eXitus schrieb:
Warum nicht einfach
while(true) { c = accept(s, (struct sockaddr*)&cli, &cli_size); if (c == -1) { perror("accept() failed"); return 5; } printf("client from %s", inet_ntoa(cli.sin_addr)); if (handling(c) == -1) fprintf(stderr, "%s: handling() failed", argv[0]); /* hier empfiehlt sich kein return mehr, weil sonst der * ganze Server beendet wird wenn ein Client wegstirbt. Das ist * natürlich nicht sinnvoll. */ closesocket(c); }Gruß eXitus
Die Lösung geht leider auch nicht...

-
1. Problem beschreiben
2. Codestelle raussuchen
3. Welche Endlosschleife?
-
Du hast cli_size nicht initialisiert:
cli_size = sizeof(SOCKADDR_IN);
-
BBBB schrieb:
Du hast cli_size nicht initialisiert:
cli_size = sizeof(SOCKADDR_IN);Stimmt, aber die Schleife bricht trotzdem sofort ab. Sowas habe ich noch nie erlebt, naja... Hier nochmal der Codeblock:
for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT AB { c = accept(s, (struct sockaddr*)&cli, &cli_size); if (c == -1) { perror("accept() failed"); return 5; } printf("client from %s", inet_ntoa(cli.sin_addr)); if (handling(c) == -1) fprintf(stderr, "%s: handling() failed", argv[0]); closesocket(c); } return 0; }
-
skullyan schrieb:
for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT ABWO bricht es ab? bist du mal mit dem Debugger schrittweise durchgegangen?
-
pumuckl schrieb:
skullyan schrieb:
for(;;) // <--------------- DIE SCHLEIFE GEHT NICHT. DAS PROGRAMM BRICHT SOFORT ABWO bricht es ab? bist du mal mit dem Debugger schrittweise durchgegangen?
Ja, hier:
if (argc != 2) { fprintf(stderr, "usage: %s port\n", argv[0]); return 1; }Nachdem ich
fprintfmit einer C++ Instanz (cout) ersetzt habe, trat der fehler nicht mehr auf.. Komisch... Liegt das vielleicht daran, dass ich keinstdio.hinkludiert hatte? Und wenn ja, wieso ließ sich das Programm überhaupt kompilieren?EDIT: Wie ich eben festgestellt habe, lag es daran, dass
stdio.hnicht inkludiert war. Mich wundert nur, dass der Compiler da nicht meckert... Gelöst.