Практика сетевого программирования на C: я пишу простое клиент-серверное приложение TCP, которое должно отправлять сообщение (в отдельном потоке для каждого клиента) в виде строки с сервера на клиент и печатать сообщение на на стороне клиента (последняя на этом станет консольным магазином приложений). Сначала я отправляю размер сообщения, а затем само сообщение с использованием сокетов, функция write()
. Сторона сервера:
void answer(void *arg) {
struct thData tdL;
tdL= *((struct thData*)arg);
// Welcome message
char *initMsgToClient;
getInitialMessage(&initMsgToClient);
int len_initMsgToClient = strlen(initMsgToClient);
// Returning message to client
if ( write (tdL.cl, &len_initMsgToClient, sizeof(int)) <= 0 ) {
printf("[Thread %d] ",tdL.idThread);
perror ("[Thread] Error at write(): len_initMsgToClient to client.\n");
}
if (write (tdL.cl, initMsgToClient, len_initMsgToClient) <= 0) {
printf("[Thread %d] ",tdL.idThread);
perror ("[Thread]Error at write(): initMsgToClient to client.\n");
}
else
printf ("[Thread %d] Message was sent with success.\n",tdL.idThread);
}
void getInitialMessage(char **paramMessage) {
char *resultMessage = "Welcome to Console Shopper!";
*paramMessage = resultMessage;
}
И на стороне клиента я сначала читаю размер и само сообщение и печатаю его, но каждый раз, когда я запускаю ./client
, я получаю разные произвольные символы в конце сообщения. Клиентская сторона:
char welcomeMessageFromServer[512];
int lenWelcomeMsg;
// 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 (read(sd, welcomeMessageFromServer, lenWelcomeMsg) < 0) {
perror ("[client] Error reading welcome message from server.\n");
return errno;
}
printf("%s",welcomeMessageFromServer);
printf("\n");
Для простоты я не добавил код для обработки сокетов и потоков, большая часть которого приведена в учебнике, поэтому он должен быть правильным. Я почти уверен, что делаю что-то не так с размером отправляемого / получаемого сообщения.
Мой вывод с несколькими прогонами для ./client
:
Welcome to Console Shopper!
Welcome to Console Shopper!�
Welcome to Console Shopper!������i0
Welcome to Console Shopper!������UF+:
В некоторых случаях это получается правильно. Что я должен исправить, чтобы все время получать правильное сообщение?