[C] Pisanie i czytanie z gniazda aplikacji klient-serwer

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:

  1. 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()");
    
     }
    
  2. 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);
    
  3. 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;
    
     	}
    
     }
    
  4. 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]);

	}
  1. 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?

Program nie wisi, program czeka określony w ReadTimeOut - czas. Niech klient przekaże ile tych command zamierza przysłać a potem je wysyła.

Ok. Wysyłam do serwera liczbę argumentów i read() wywołuję w for wykonywanym tyle razy ile jest argumentów. Rozumiem, że read() działa tak, że przy każdym wywołaniu czeka pewien okres czasu zdefiniowany jako ReadTimeOut aż przyjdą jakieś dane?

Aż przyjdą jakieś dane lub skończy się ReadTimeOut (który domyślnie jest bodajże - nieskończony).