Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 48
1

Реализация простейшего почтового сервера и протокола взаимодействия с ним (ошибка в коде)

24.05.2016, 12:45. Просмотров 2500. Ответов 1
Метки нет (Все метки)

Задание:
Реализовать простейший почтовый сервер и протокол взаимодействия с ним. Предусмотреть команды отправки и чтения входящих писем.

Примечание: программа-клиент при запуске инициализирует библиотеку WinSock, создаёт сокет и подключается к удалённому серверу по протоколу TCP. Далее выполняется ввод текущей команды и её отправка. Цикл отправки выполняется до тех пор, пока не будет введена команда выхода, после чего клиент завершает свою работу.
Программа-сервер инициализирует библиотеку WinSock, создаёт сокет и ожидает подключения клиента. После подключения для нового клиента создаётся новый поток, в котором осуществляется функционирование почтового сервера. В процессе работы сервер принимает команды от клиента, и в зависимости от команды выполняются чтение сообщений или выход. При получении команды выхода почтовый сервер завершает свою работу.

Программа писалась в C++ Builder 6

сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// подключение библиотек
 
#include <winsock2.h>
#include <iostream> 
 
int main() 
{
    
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2,2);
    err = WSAStartup(wVersionRequested, &wsaData); 
    //определение ошибки запуска WinAPI , завершение работы
    if(err != 0) return -1; 
    
    //структура адреса
    struct sockaddr_in peer;
    peer.sin_family=AF_INET;
    peer.sin_port=htons(1280);
    peer.sin_addr.s_addr=inet_addr("127.0.0.1"); 
    
    //открытие сокета
    SOCKET s=socket(AF_INET,SOCK_STREAM,0);
    
    //соединение с сокетом
    connect(s,(struct sockaddr*) &peer,sizeof(peer)); 
    
    char b[200]; 
    
    //получение данных от сервера
    recv(s,b,sizeof(b),0);
    
    //вывод результата - в данном случае подсоединен ли клиент
    cout<<b; 
    b[0]='\0';
 
    //завершение работы по слову quit
    while (strcmp(b,"quit")) 
    {
        char temp_1 [200];
    cin.getline(b,200,'\n');
        send(s,b,sizeof(b),0);
    
        
        recv(s,temp_1, sizeof(temp_1),0);
        cout<<temp_1<<endl;
            
}
 
    WSACleanup();
    return 0;
}
клиент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//подключение библиотек
#include <iostream>
#include "afx.h"
#include <winsock2.h>
#include <process.h> /* _beginthread, _endthread */
#include <string.h>
#include <time.h> 
 
 
//переменная файлового типа
CFile f;
CFileException ex;
//clock_t start, finish;
 
// функция чтения сообщений
char* read (char* p,int n) 
{
    char mail[200];
    char * message = new char[200];
    int j=0;
    for (int i=n;p[i]!=' ';i++) 
    {
        mail[j]=p[i];
        j++;
    }
    
    char fName[200];
    strcpy(fName,mail);
    ////////
//  char message[200];
    
    f.Open(fName, ios::out);
    if(!f) cout <<"Error"<<endl;
    f.Read(message,strlen(message));
    f.Close();
//  cout<<message<<endl;
//  cout<<"_________________"<<endl;
 
    
    return message;
} 
 
 
int main() 
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2,2);
    err = WSAStartup(wVersionRequested, &wsaData); 
    if(err != 0) return -1;
    
    sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(1280); 
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    SOCKET s = socket(AF_INET, SOCK_STREAM,0);
    
    int c=bind(s,(struct sockaddr*)&local,sizeof(local));
    int r=listen(s,5);
    
    while(true) 
    {
        sockaddr_in remote;
        int j = sizeof(remote);
        SOCKET newS = accept(s, (struct sockaddr*) &remote, &j);
        
        _beginthread(mailworking,0,(void*)newS);
    }
    WSACleanup();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2016, 12:45
Ответы с готовыми решениями:

Ошибка в коде взаимодействия клиента и сервера на основе протокола TCP/IP (ошибка в коде)
Задание: Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать...

Ошибка в коде программы взаимодействия клиента и сервера без установления логического соединения (UDP)
Задание: Осуществить взаимодействие клиента и сервера без установления логического соединения...

Реализация простейшего класса для сложения двух чисел: найти и исправить ошибки в коде
Всем привет. Только-только начал изучать классы, решил написать свою программу с классом для...

Как узнать pop\imap адрес почтового сервера, для почтового ящика через whois
Добрый вечер. Есть нетривиальная задача: Как узнать pop\imap адрес почтового сервера, для...

1
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 48
02.06.2016, 09:57  [ТС] 2
апп
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2016, 09:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подбор сервера AD, почтового сервера, 1С сервера и почтового сервера
Доброго времени суток! В организации встал вопрос о покупке серверов. Бюджет пока неизвестен....

Ошибка "Недействительный сертификат сервера" при запуске почтового клиента The Bat 5.2
Доброе утро! вообщем все плохо! с утра запустил почтовый клиент The Bat 5.2 он не получает почту и...

Прозрачный компонент для взаимодействия с ним
Всем привет!) У меня такой вопрос: &quot;Есть ли возможность сделать что-то вроде прозрачного...

Написание простейшего сервера
Здравствуйте, погуглил, поискал по форумам, но не нашел, как сделать, чтобы можно было подключиться...

Реализация простейшего прерывания
Доброго времени суток. Выполняю работу на tasm в dosemu. Информации везде много, но либо сухая...

Простейший почтовый сервер и протокол взаимодействия с ним
Реализовать простейший почтовый сервер и протокол взаимодействия с ним. Предусмотреть команды...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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