В настоящее время я пишу чат для локальных сетей на языке C. Для обучения.
Я знаю, что ncurses не любит работать с многопоточностью, но это единственное решение, которое я нашел послепросматривая другие посты. Я могу получить неблокирующий ввод при получении сообщений, но есть некоторые незначительные проблемы, такие как:
Это часть моей функции приема, она запускается в отдельном потоке. Он просто получает пакеты (состоящие из переменных имени хоста, ip, сообщения и типа пакета), поступающие с сервера, и печатает их в окне терминала. Функция read_packet работает правильно, поэтому нет необходимости исследовать ее дальше.
while(runstate > 0) {
pthread_mutex_lock(&lock);
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
fdsize = sockfd + 1;
timeout.tv_sec = 0;
timeout.tv_usec = 10000;
recvstate = select(fdsize, &readfds, NULL, NULL, &timeout);
if(recvstate > 0) {
if(FD_ISSET(sockfd, &readfds)) {
memset(&receive, 0, sizeof(struct packet));
read_packet(&receive, sockfd);
receive.msg[ARRAY_SIZE(receive.msg) - 1] = '\0';
print_msg(gui, receive.hostname, receive.msg);
}
}
pthread_mutex_unlock(&lock);
}
return NULL;
Это функция print_msg, и ее задача - собрать вместе имя хоста + msg и напечатать их.
int print_msg(struct interface *gui, char *hostname, char *msg)
{
if(strlen(msg) <= 0)
return 0;
char message[96];
memset(&message, 0, 96);
snprintf(message, sizeof(message), "%s: %s", hostname, msg);
mvwprintw(gui->chat, gui->line, 3, message);
gui->line++;
wrefresh(gui->chat);
return 1;
}
Хотя отпечатки выглядят испорченными, хотя отладчик показывает, что переменные верны:
https://imgur.com/a/EvH270F (доступно описание)