Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 4

Некорректная работа почтового сервера

09.05.2021, 13:06. Показов 1014. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день!
В изучении Си являюсь новичком, прошу помощи у участников форума. По заданию необходимо разработать почтовый сервер и клиенты для отправки и принятия сообщений. По логике: клиент отправляет сообщение другому клиенту, сервер его обрабатывает и отправляет дальше. Пытаюсь реализовать авторизацию пользователя в сети с помощью ввода логина и пароля. Есть файл base_user.txt с зарегистрированными комбинациями "логин пароль". Далее код пытается обработать файл на сравнение введенных данных и данных с файла (основано на "нуле" от flag_username), но почему-то не выдает значение ноль. Возможно, связанно с не нулевым окончанием строк (в файл test.txt записывается с переводом на новую строку, как я понял; в файле base_user последний пустой символ - пробел), но исправлял эту ситуацию найденным на просторах этого форума кода, опять-таки результатов не принесло.

Большинство решений выполнено костылями (по не знанию и каким-то причинам не работающих функций). Клиент вводит значение email как "1@example.com" без "USER". Сам сервер на 600+ строк, поэтому вот кусок с авторизацией пользователя:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 pid_t pid = fork(); // создание нитей
            
            if (pid < 0) // ошибка создания нитей
            {
                perror("fork() failed...\n");
                return -1;
            }
                
            if (pid == 0) // если 0, то дочерний процесс
            {
                close(server_socketFd); // закрытие "родительского" процесса
                
                while (1) // бесконечный цикл для работы сервера и клиента
                {
                    memset(&buff, 0, sizeof(buff)); 
                    memset(&buff_copy, 0, sizeof(buff_copy));
                    memset(&tmp, 0, sizeof(tmp));
                    
                    read(client_socketFd, &buff, sizeof(buff)); // получение данных от сервера по средствам сокета
                    printf("C->S: %s", buff); // вывод ответа серверe в консоль  
                                     
                    if (strcmp(buff, "USER") != NULL) // идентификация пользователя с указанным логином
                    {               
                        if (strlen(buff) > 5)
                        {
                            check_user(buff); // проверка введенного логина
                        } else
                        {
                            strcpy(buff, "-ERR short email");
                            write(client_socketFd, &buff, sizeof(buff)); // отправка результата проверки логина пользователю
                        }
                    } else if (strncmp(buff, "PASS", 4) != NULL) // идентифицирует пользователя с указанным паролем
                    {
                        if (flag_user == 0)
                        {
                            strcpy(buff, "-ERR user first\n");
                            write(client_socketFd, &buff, sizeof(buff)); // отправка результата проверки логина пользователю
                        } else
                        {
                            if ((strlen(buff)) > 8 || (strlen(buff) < 20))
                            {
                                check_pass(buff); // проверка логин+пароль
                                flag_pass = 1;
                                
                                write(client_socketFd, &buff_copy, sizeof(buff_copy)); // отправка результата проверки пользователю
                            } else
                            {
                                if (strlen(buff) < 8)
                                {
                                    strcpy(buff, "-ERR short password\n");
                                }
                                
                                if (strlen(buff) > 20)
                                {
                                    strcpy(buff, "-ERR long password\n");
                                }
                                
                                write(client_socketFd, &buff, sizeof(buff)); // отправка результата проверки пароля пользователю
                            }
                        }
Результатом является сообщение "-ERR user first", то есть почему-то обходит авторизацию логина и сразу запрашивает пароль.
Прошу помочь в данном вопросе...
Вложения
Тип файла: txt base_user.txt (97 байт, 2 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2021, 13:06
Ответы с готовыми решениями:

Заведение новых пользователей для почтового сервера в Linux
Здравствуйте, появилась задача завести пользователей в Линуксе( для почтового сервера), но их 150 человек. Есть текстовый файл, в котором...

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают нормально. Вставляю их прототипы в функцию main() и нижняя...

Некорректная работа
Почему когда ввожу численные значения (1.2.3.4) все столбцы ровные и все корректно отображается ,но когда ввожу хоть одну букву ,то все...

1
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
13.05.2021, 20:02
Нужно вернуться к основам и разобраться с самими С-строками и стандартными str* функциями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.05.2021, 20:02
Помогаю со студенческими работами здесь

Некорректная работа программы
Добрый день. Есть небольшая проблема в написании кода. Нужно вычислить значение по указанной формуле, используя функции математической...

Некорректная работа меню
Почему &quot;Choose smth&quot; два раза выводится? И не понимаю, почему ввод выбора осуществляется именно так, через atoi (содрано с Шилдта). Почему...

Модуль ядра, некорректная работа
Здравствуйте!, изучаю тему написания модулей ядра. Начал с Hello, world. #include &lt;linux/module.h&gt; int __init...

Некорректная работа программы (строки)
Необходимо ввести шестизначное число, первые две цифры которого обозначают месяц. Но если число будет начинаться с 0, тогда оно неправильно...

Как узнать pop\imap адрес почтового сервера, для почтового ящика через whois
Добрый вечер. Есть нетривиальная задача: Как узнать pop\imap адрес почтового сервера, для почтового ящика через whois? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru