Практика сетевого программирования на 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);
-------------------------^