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

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

07.05.2012, 01:11. Показов 2515. Ответов 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
8488 / 6155 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru