Функция printf () на стороне сервера не печатает без "\ n" (клиент-сервер TCP с использованием сокетов) - PullRequest
0 голосов
/ 06 января 2019

Практика сетевого программирования на C: я пишу простое клиент-серверное приложение TCP, которое должно отправлять меню (в отдельном потоке для каждого клиента) в виде строки с сервера на клиент и печатать меню на клиенте сторона (последняя на этом станет приложением магазина пульта). Затем клиент должен отправить int (выбранная опция из меню), а сервер должен получить его, но сервер даже не печатает ошибку. Сторона сервера:

// Returning message to client
if ( write (tdL.cl, &size_firstLoginMenu, sizeof(int)) <= 0 ) {
    printf("[Thread %d] ",tdL.idThread);
    perror ("[Thread] Error at write(): size_firstLoginMenu to client.\n");
}
if (write (tdL.cl, firstLoginMenu, size_firstLoginMenu) <= 0) {
    printf("[Thread %d] ",tdL.idThread);
    perror ("[Thread] Error at write(): firstLoginMenu to client.\n");
} else {
    printf ("[Thread %d] Message firstLoginMenu was sent succesfully.\n",tdL.idThread);
}

// Reading the client's selected option 
int selectedOption; 
if (read(tdL.cl, &selectedOption, sizeof(int)) <= 0) {
    printf("[Thread %d]\n",tdL.idThread);
    perror ("Error at read() from client.\n");
}
printf("Message from clinet, selectedOption: %d", selectedOption);

К сожалению, ни один из двух последних отпечатков не отображается на консоли сервера, я отправляю selectedOption в последней части клиента:

// Reading size of first mesage: lenWelcomeMsg
if (read(sd, &lenWelcomeMsg, sizeof(int)) < 0) {
    perror ("[client] Error reading len welcome message from server.\n");
}
// Reading initial message from server: welcomeMessageFromServer
if (readAll(sd, welcomeMessageFromServer, lenWelcomeMsg) < 0) {
    perror ("[client] Error reading welcome message from server.\n");
    return errno;
}
// Initial menu - Login Sign Up - message
char initialMenu[512];
int len_initialMenu;
// Reading size of first mesage: lenWelcomeMsg
if (read(sd, &len_initialMenu, sizeof(int)) < 0) {
    perror ("[client] Error reading len_initialMenu from server.\n");
}
// Reading initial menu - Login Sign Up - message from server: initialMenu
if (readAll(sd, initialMenu, len_initialMenu) < 0) {
    perror ("[client] Error reading initialMenu message from server.\n");
    return errno;
}

printf("%s",welcomeMessageFromServer);
printf("\n");
printf("%s",initialMenu);
printf("\n\nSelect your option...\n");

// Sending message containing client selected option to the server  
if (write (sd, &selectedOption,sizeof(int)) <= 0) {
  perror ("[client] Error at write() selectedOption from client to server.\n");
  return errno;
}

Выходной сигнал Clinet:

Welcome to Console Shopper!

1. Login.
2. Sign Up.


Select your option... 1

Выход с боковой стороны:

[Thread 0] Sending Welcome message to client:
Welcome to Console Shopper!
[Thread 0] Message initMsgToClient was sent succesfully.
[Thread 0] Sending first menu message to client:
1. Login.
2. Sign Up.
[Thread 0] Message firstLoginMenu was sent succesfully.

Я ожидал, по крайней мере, ошибки, так как лечу if (read() <= 0), но ничего ниже int selectedOption; не печатается.

ОБНОВЛЕНИЕ: Нашел решение: добавление \n внутри последнего printf на сервере решает проблему, я все еще не понимаю, почему простой \n может привести к остановке печати сервером, и был бы признателен, если бы кто-нибудь нашел время, чтобы объяснить мне, почему это так. Я имею в виду:

printf("Message from clinet, selectedOption: %d\n", selectedOption);
                       -------------------------^

1 Ответ

0 голосов
/ 07 января 2019

добавление \n внутри последней printf на сервере устраняет проблему, я все еще не понимаю, почему простое \n может привести к остановке печати на сервере, и был бы признателен, если бы кто-нибудь нашел время, чтобы объяснить мне, почему это так

Вы наблюдаете буферизацию stdout в стандартной библиотеке C, см. man stdout:

Поток stderr небуферизован. Поток stdout буферизуется в строке, когда он указывает на терминал. Частичные строки не будут отображаться до тех пор, пока не будет вызван fflush(3) или exit(3) или не будет напечатана новая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...