Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SMTP сервер 
V
    Опции темы
mChief
Дата 11.11.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



Помогите разобраться с заданием и подскажите с чего начать. Пробвал читать RFC по SMTP, но понимания что именно нужно делать не пришло smile.
Задание звучит так:
Написать программу, которая выполняет функции промежуточного SMTP-сервера. Сервер должен получить инструкции от клиента на передачу почты, добавить в заголовок сообщения информацию о промежуточный сервер и передать сообщение другому SMTP-серверу.
PM MAIL   Вверх
GrayCardinal
Дата 11.11.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



ИМХО, начать надо с простого сквозного TCP сервера. т.е. Получает команды. отправляет на реальный сервер, и всё это логится... Дальше - дело техники. Набросать простой сервак ?


--------------------
PM MAIL WWW   Вверх
mChief
Дата 11.11.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



Сквозной TCP сервер, я думаю, смогу написать, а как быть дальше? Нужно тогда еще написать псевдо-клиент, который будет отправлять этому серверу готовое письмо с заголовком? И, наверное, еще один псевдо-сервер который будет ловить все эти сообщения, потому как реальные SMTP сервера наверняка меня пошлютsmile
PM MAIL   Вверх
GrayCardinal
Дата 11.11.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



А дальше... Сквозным серваком ловите команду DATA, читаете тело письма, добавляете нужный хидер и шлете дальше...


--------------------
PM MAIL WWW   Вверх
mChief
Дата 11.11.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



Начинаю понимать. И еще два вороса: Как лучше будет читать данные из сокета если я знаю что шлет их почтовый клиент? Какой нужен размер буфера?
PM MAIL   Вверх
GrayCardinal
Дата 11.11.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



mChief, 
Первый вопрос не понял. Второй... На любителя. Вплоть до мегабайта. Больше я бы не стал smile


--------------------
PM MAIL WWW   Вверх
mChief
Дата 12.11.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



Неудачно сформулировал первый вопросsmile Я просто хотел узнать есть ли какие-нибудь особенности работы с текстовыми протоколами.

Попробовал написать сквозной сервер, подскажите если что не так

Код

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <resolv.h>
#include <string.h>

#define SERVER_IP "94.100.177.6"
#define PORT 110
#define QUEUE 5
#define BSIZE 2048

int main(){
    int listen_sock,conn_sock,send_sock;
    char buf[BSIZE]={0};
    struct sockaddr_in cli_addr,serv_addr,send_addr;

    send_sock=socket(AF_INET,SOCK_STREAM,0);
    if(!send_sock){
        printf("Can't create send socket\n");
        abort();
    }
    bzero(&send_addr,sizeof(send_addr));
    send_addr.sin_family=AF_INET;
    send_addr.sin_port=htons(PORT);
    char* host=SERVER_IP;
    inet_aton(host, &send_addr.sin_addr);

    listen_sock=socket(AF_INET,SOCK_STREAM,0);
    if(!listen_sock){
        printf("Can't create listen socket\n");
        abort();
    }
    bzero(&serv_addr,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(PORT);
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bind(listen_sock,&serv_addr,sizeof(serv_addr));
    listen(listen_sock,QUEUE);
    for(;;){
        //clilen=sizeof(cli_addr);
        conn_sock=accept(listen_sock,&cli_addr,sizeof(cli_addr));
        if(!listen_sock){
            printf("Can't create conn socket\n");
            abort();
        }
        int childpid=0;
        if(childpid=fork()==0){
            //потомок
            close(listen_sock);

            if ( connect(send_sock, &send_addr, sizeof(send_addr)) !=0 ){
                perror("Server connection error");
                abort();
            }
            int msgsize=0;
            for(;;){
                msgsize=recv(listen_sock,buf,BSIZE,0);
                if(msgsize==0) exit(0);
                send(send_sock,buf,msgsize,0);
            }
            //exit(0);
        } else {
            //родитель
            close(conn_sock);
        }
    }
    return 0;
}



Как я понимаю теперь в коде потомка нужно ловить команду DATA и править заголовок письма.
PM MAIL   Вверх
GrayCardinal
Дата 12.11.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Нормально. Только я бы bzero заменил на memset, да результат bind проверил... smile

Добавлено через 59 секунд
На счет особенностей. Знаю одну. Конец строки должен быть 0x0D 0x0A. В *nix используется только 0x0A. 0x0D надо ручками добавлять.....


--------------------
PM MAIL WWW   Вверх
mChief
Дата 12.11.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



Спасибо за помощь, дальше я уже допишу smile
PM MAIL   Вверх
GrayCardinal
Дата 12.11.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



mChief, 
Завсегда пожалуйста...


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 12.11.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



mChief, 
во-первых по самому коду, я настоятельно рекомендую компилировать с ключом -Wall и фиксить все warning'и
это просто хороший стиль, а иногда позволяет выявить потенциальне баги ;)

во-вторых по типу реализации сервера: никогда без особой необходиости не следует юзать форки
мультиплексирование ввода-вывода никто не отменял ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mChief
Дата 16.11.2009, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



MAKCim,  спасибо за замечания
А можете немного пояснить про форки и мультиплексирование ввода-вывода ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.