Ncurses печатает неправильные строки в программе на основе сокетов - PullRequest
0 голосов
/ 09 ноября 2019

В настоящее время я пишу чат для локальных сетей на языке 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 (доступно описание)

...