Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

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

07.05.2012, 01:11. Просмотров 1126. Ответов 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];
};
0
Миниатюры
TCP/IP передача писем от сервера клиенту   TCP/IP передача писем от сервера клиенту   TCP/IP передача писем от сервера клиенту  

Вложения
Тип файла: rar KS_Lab_5_Server.rar (3.3 Кб, 29 просмотров)
Тип файла: rar KS_Lab_5_Client.rar (2.1 Кб, 32 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 01:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос TCP/IP передача писем от сервера клиенту (C++):

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

Снятие экрана сервера и отправка его клиенту. - C++
Привет всем. Я пишу на VC++2010. Пишу только консольные приложения. По учебе дали написать прогу клиент-сервер, которая должна по...

Соединение tcp client и tcp server - C++
accept(); bind(); connect(); listen(); socket(); Нужно расположить их в порядке в каком их вызывает (А) сервер (Б) клиент, чтобы...

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

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

Передача сообщения с сервера клиенту - C#
Здравствуйте! Я только начинающий программист, пишу програмку для интернет клуба. И вот у меня два вопроса: 1) Подскажыте как можно на...

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

Добавлено через 5 минут
А может кто-нибудь знает как без Sleep сделать, чтобы сервер ожидал пока клиент будет готов принять ключ?
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,798
Записей в блоге: 17
07.05.2012, 03:33 #3
смотри WaitForSingleObject()

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
07.05.2012, 03:59  [ТС] #4
Avazart, не особо понял как оно тут может помочь. Обычно использовал, чтобы несколько процессов не пересекались. Сделал подтверждение о получении, всё работает, но один косяк есть. Если закрывать программу-клиент аварийно, то сервер зацикливает и он больше недоступен.
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.05.2012, 11:57 #5
Цитата Сообщение от Riderik Посмотреть сообщение
А может кто-нибудь знает как без Sleep сделать, чтобы сервер ожидал пока клиент будет готов принять ключ?
C
1
2
3
4
5
6
7
8
setsockopt 
        (
                pSOCKET,
                SOL_SOCKET, 
                SO_RCVTIMEO, 
                (const char*)&dwTIMEOUT, 
                sizeof(DWORD)
        );
- устанавливает таймаут для соединения, если по истечению dwTIMEOUT мсек если ничего не пришло, ожидание прекращается
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2012, 11:57
Привет! Вот еще темы с ответами:

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

Передача изображения от сервера к клиенту - C#
Сервер: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; ...

Передача значения от сервера к клиенту на ajax - jQuery
Всем привет, подскажите как решить задачу: отправляю запрос на сервер при помощи jquery $.post, как принять на клиенте переменную php ?...

Передача файлов от сервера к клиенту через сокеты - Delphi
как с поьощью сокетов передать файл от сервера к клиенту???


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
07.05.2012, 11:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru