Mam problem polegający na tym, że aplikacja serwera czyta dane wysłane przez klienta po czym nie wychodzi z pętli czytającej aż do momentu wywołania w kliencie Ctrl+C.
Aplikacja prezentuje się następująco:
-
W momencie połączenia, serwer wysyła przez gniazdo connection wiadomość msg:
//struktura adresowa gniazda do nasłuchiwania
struct sockaddr_in clientAddr; char* msg = "Witaj kliencie!"; socklen_t clientLength = sizeof(clientAddr); //wyczyszczenie struktury - wypełnienie zerami memset(&clientAddr, 0, sizeof(clientAddr)); //printf("Deskryptor: %d\n", *connection); if ((getpeername(*connection, (struct sockaddr *) &clientAddr, &clientLength)) < 0) { perror("getpeername()"); } if (write(*connection, msg, strlen(msg)) != strlen(msg)) { perror("write()"); }
-
Klient czyta z clientSocket do buffer to co odesłał serwer czyli “Witaj kliencie!”. Do tej pory wszystko jest OK.
in = read(clientSocket, buffer, MAX_BUFFER);
buffer[in] = 0; printf("\n%s\n", buffer);
-
Klient wysyła liczby przekazane przy wywołaniu (pierwsze dwa argumenty to adres serwera i port dlatego i = 3).
int tmp;
for (i = 3; i < argc; i++) { tmp = atoi(argv[i]); if (write(clientSocket, &tmp, sizeof(int)) != sizeof(int)) { fprintf(stderr, "Could not send filename to server!\n"); return 1; } }
-
Serwer wczytuje liczby do tablicy int command. I tutaj pojawia się problem. Wysyłam 3 liczby więc wyświetla:
I tutaj program stoi. Mimo, że otrzymał wszystkie dane to ten for po while’u z read’em wykonuje się dopiero jak zakończę klienta za pomocą Ctrl+C.
int in;
int i = 0;
int argCount = 0;
//int args[3];
char buffer[1024];
int tmp;
int command[4];
while ((in = read(*connection, &tmp, sizeof(int))) > 0)
{
printf("Czytam...\n");
command[i] = tmp;
printf("Wczytano command[%d] = %d\n", i, command[i]);
i++;
argCount++;
}
for (i = 0; i < argCount; i++)
{
printf("%d\n", command[i]);
}
-
Na koniec program ma wysłać nazwę metody, którą wywołuje kod podany jako pierwszy argument co miał realizować poniższy kod ale nie realizuje bo program wisi na while’u z read().
switch (command[i])
{ case 1: strcat(buffer, "Potegowanie modularne\n"); break; case 2: strcat(buffer, "Najwiekszy wspolny dzielnik\n"); break; default: strcat(buffer, "Nieznana metoda\n"); break; } if (write(*connection, buffer, strlen(buffer)) != strlen(buffer)) { perror("write()"); } else { printf("Wyslano odpowiedz\n"); } //printf("Klient: %s\n", inet_ntoa(clientAddr.sin_addr)); close(*connection);
Macie jakieś pomysły w czym może być problem?