Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171

TCP/IP передача писем от сервера клиенту

07.05.2012, 01:11. Показов 2553. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть простейший почтовый сервер и почтовый клиент. Взаимодействие реализовано с помощью отправки констант, означающие например "отправить письмо", "зарегистрироваться", "получить письма". Все методы работают как надо, кроме одного, который работает по настроению. Я так и не понял, от чего он иногда отказывает. Метод передачи писем от сервера клиенту. Бывает ситуация: регистрируется пользователь, отправляет сам себе письмо, получает его как надо, и клиент ожидает от сервера еще чего-то, хотя сервер уже отослал ключ, означающий конец списка. После чего, если закрыть клиент, сервер уходит в бесконечный цикл, что-то пытаясь то ли разослать, то ли не знаю. При повторном запуске сервера и клиента этот же клиент получает письмо как надо и всё хорошо. А бывает, что письмо приходит с первого раза хорошо, но второе приходит с какими-то неадекватными символами. Вообще думаю, что не лучшая идея использовать по 3 send еще и в цикле у сервера при отправки письма. Может поэтому. Кто хорошо знаком с TCP/IP подскажите что тут может быть не так.
Сервер, отправка писем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void MailServer::GetMail() 
{ //расставил сиауты, пытаясь найти ошибку
    cout<<"\nОтправка входящих писем "<<logined.login;
    LoadMailList();
    for(list<Mail>::iterator it=mailList.begin(); it != mailList.end(); it++)
    {cout<<"\nОтправка "<<(int)OK<<"("<<sizeof(OK)<<")";
        send(s_cl, &OK, sizeof(OK), 0); //ОК значит, что сейчас будет отправка письма
        cout<<"\nОтправка "<<it->fromUser<<"("<<strlen(it->fromUser)+1<<")"; 
        send(s_cl, it->fromUser, strlen(it->fromUser)+1, 0); 
        cout<<"\nОтправка "<<it->text<<"("<<strlen(it->text)+1<<")";
        send(s_cl, it->text, strlen(it->text)+1, 0);
    }cout<<"\nОтправка "<<int(ERR)<<"("<<sizeof(ERR)<<")";
    send(s_cl, &ERR, sizeof(ERR), 0); //ERR значит, что писем больше нет
    cout<<"\nВходящие письма "<<logined.login<<" отправлены";
}
Клиент, получение писем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void MailClient::GetMail()
{
    send(sock, &GET_MAIL, sizeof(GET_MAIL), 0); // GET_MAIL вызывает метод GetMail на сервере
    char key[1]; //для получения ОК или ERR
    Mail mail;
    cout<<"\nВходящие сообщения: \n";
    while( recv(sock, key, sizeof(key),0))
    {
        cout<<"\nПолучен ключ "<<(int)key[0];
        if(key[0] != OK ) return;
        cout<<"\nОжидание from";
        if( !recv(sock, mail.fromUser, sizeof(mail.fromUser),0)) throw "Сервер не отвечает"; 
        cout<<"\nПолучен "<<mail.fromUser<<"\nОжидание text";
        if( !recv(sock, mail.text, sizeof(mail.text),0)) throw "Сервер не отвечает";
        cout<<"\nПолучен "<<mail.text;
        cout<<"\nОт: "<<mail.fromUser
            <<"\nСообщение: "<<mail.text;
    }
}
Кличи и структура письма:
C++
1
2
3
4
5
6
const char LOGIN=1, REGISTER=2, GET_MAIL=3, SEND_MAIL=4, ERR=5, OK=6;
struct Mail
{
    char fromUser[16];
    char text[32000];
};
Миниатюры
TCP/IP передача писем от сервера клиенту   TCP/IP передача писем от сервера клиенту   TCP/IP передача писем от сервера клиенту  

Вложения
Тип файла: rar KS_Lab_5_Server.rar (3.3 Кб, 38 просмотров)
Тип файла: rar KS_Lab_5_Client.rar (2.1 Кб, 42 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2012, 01:11
Ответы с готовыми решениями:

Передача файлов с Apache сервера к C++ клиенту
Как возможно (или это вообще возможно?) реализовать подключение к готовому Apache серверу из внешнего компьютера по средствам С++ и...

Передача массива от сервера к клиенту
Каким образом можно передать массив от сервера к клиенту. Используется TServerSocket, TClientSocket. И возможно ли это вообще?

Передача вектора от сервера клиенту
Логика задания такая: клиент посылает серверу, скажем, дату, а тот находит все детали, сделанные на разных предприятиях в этот день и...

4
 Аватар для Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
07.05.2012, 02:15  [ТС]
Решил проблему. В конце цикла отправки сообщений поставил Sleep(10). Видимо ключ отправлялся быстрее, чем клиент успевал включить соответствующее ожидание, хотя может и не так.

Добавлено через 5 минут
А может кто-нибудь знает как без Sleep сделать, чтобы сервер ожидал пока клиент будет готов принять ключ?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.05.2012, 03:33
смотри WaitForSingleObject()

http://msdn.microsoft.com/en-u... s.85).aspx
0
 Аватар для Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
07.05.2012, 03:59  [ТС]
Avazart, не особо понял как оно тут может помочь. Обычно использовал, чтобы несколько процессов не пересекались. Сделал подтверждение о получении, всё работает, но один косяк есть. Если закрывать программу-клиент аварийно, то сервер зацикливает и он больше недоступен.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.05.2012, 11:57
Цитата Сообщение от Riderik Посмотреть сообщение
А может кто-нибудь знает как без Sleep сделать, чтобы сервер ожидал пока клиент будет готов принять ключ?
C
1
2
3
4
5
6
7
8
setsockopt 
        (
                pSOCKET,
                SOL_SOCKET, 
                SO_RCVTIMEO, 
                (const char*)&dwTIMEOUT, 
                sizeof(DWORD)
        );
- устанавливает таймаут для соединения, если по истечению dwTIMEOUT мсек если ничего не пришло, ожидание прекращается
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2012, 11:57
Помогаю со студенческими работами здесь

Вывод и передача текста клиенту из консоли сервера после выполнения команды Bash на Qt
Здравствуйте! Есть задание: клиент отправляет Bash-команды серверу, тот их выполняет и передаёт результат выполнения; всё это в среде Qt....

Передача содержимого от сервера клиенту или наоборот через TCP
Вопрос на засыпку. Есть сервер который должен например передать фотографию клиенту или какой то огромный текст, мы знаем что можно...

TCP. Отправка сообщений от сервера к клиенту
Всем привет. У меня есть программа-клиент и программа-сервер. На сервере успешно создается сокет. Клиент к нему успешно подключается....

Как отправить ответ клиенту с сервера TCP?
Посмотрите пожалуйста эти Клиент и Сервер. Я отправляю команду серверу с просьбой отправить данному клиенту файл, но как передать экземпляр...

TCP/IP клиент-сервер (не знаю как отправить текст от сервера к клиенту)
Помогите пожалуйста научился отправлять от клиента к серверу но наоборот никак не получается пожалуйста помогите. До сдачи осталось 3 дня


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru