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

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

Восстановить пароль Регистрация
 
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
07.05.2012, 01:11     TCP/IP передача писем от сервера клиенту #1
Есть простейший почтовый сервер и почтовый клиент. Взаимодействие реализовано с помощью отправки констант, означающие например "отправить письмо", "зарегистрироваться", "получить письма". Все методы работают как надо, кроме одного, который работает по настроению. Я так и не понял, от чего он иногда отказывает. Метод передачи писем от сервера клиенту. Бывает ситуация: регистрируется пользователь, отправляет сам себе письмо, получает его как надо, и клиент ожидает от сервера еще чего-то, хотя сервер уже отослал ключ, означающий конец списка. После чего, если закрыть клиент, сервер уходит в бесконечный цикл, что-то пытаясь то ли разослать, то ли не знаю. При повторном запуске сервера и клиента этот же клиент получает письмо как надо и всё хорошо. А бывает, что письмо приходит с первого раза хорошо, но второе приходит с какими-то неадекватными символами. Вообще думаю, что не лучшая идея использовать по 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 Кб, 27 просмотров)
Тип файла: rar KS_Lab_5_Client.rar (2.1 Кб, 30 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 01:11     TCP/IP передача писем от сервера клиенту
Посмотрите здесь:

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

Добавлено через 5 минут
А может кто-нибудь знает как без Sleep сделать, чтобы сервер ожидал пока клиент будет готов принять ключ?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
07.05.2012, 03:33     TCP/IP передача писем от сервера клиенту #3
смотри WaitForSingleObject()

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

Текущее время: 04:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru