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

C++ и сети

Войти
Регистрация
Восстановить пароль
 
timashenka
1 / 1 / 0
Регистрация: 27.08.2016
Сообщений: 17
#1

Не работает простейший почтовый сервер - C++

11.10.2017, 14:52. Просмотров 215. Ответов 4
Метки нет (Все метки)

у меня есть сервер
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
// server.cpp: определяет точку входа для консольного приложения. 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
#include <stdio.h>
#define _AFXDLL 
#include <iostream> 
#include "afx.h" 
#include <winsock2.h> 
#include <process.h> /* _beginthread, _endthread */ 
#include <string.h> 
#include <time.h> 
#include <string>
#include "atlstr.h" 
#include <windows.h> 
#include <vector> 
#include <math.h> 
#pragma comment(lib,"Ws2_32.lib")
 
using namespace std; 
CFile f; 
CFileException ex; 
 
int getInbox(const char *searchkey, vector<wstring> &list){ 
 
    WIN32_FIND_DATA fd; 
    CString tmpSearchKey(searchkey); 
    HANDLE h = FindFirstFile(tmpSearchKey, &fd); 
 
    if (h == INVALID_HANDLE_VALUE) 
    { 
        return 0; // no files found 
    } 
 
    while (1) 
    { 
        std::wstring tmpFileName = fd.cFileName; 
        list.push_back(tmpFileName); 
 
        if (FindNextFile(h, &fd) == FALSE) 
            break; 
    } 
    return list.size(); 
} 
int registerUser(char* user, char* password) { 
    string dirNameStr(user); 
    bool t = CreateDirectoryA(dirNameStr.c_str(), NULL); 
    if (ERROR_ALREADY_EXISTS == GetLastError()){ 
        return 0; 
    } 
    string inboxDir(dirNameStr + "\\inbox"); 
    bool t1 = CreateDirectoryA(inboxDir.c_str(), NULL); 
    string passFileStr(dirNameStr + "\\password"); 
    TCHAR *passFile = new TCHAR[passFileStr.size() + 1]; // преобразование типа string в tchar 
    passFile[passFileStr.size()] = 0; 
    std::copy(passFileStr.begin(), passFileStr.end(), passFile); // непосредственно преобразование 
    if (!f.Open(passFile, CFile::modeWrite | CFile::modeCreate, &ex)) { 
        cerr << "Cannot create password file. Try again\n"; 
        exit(EXIT_FAILURE); 
    } 
    f.Write(password, strlen(password)); 
    f.Close(); 
    return 1; 
} 
bool dirExists(const string& dirName_in) 
{ 
    DWORD ftyp = GetFileAttributesA(dirName_in.c_str()); 
    if (ftyp == INVALID_FILE_ATTRIBUTES) 
        return false; //something is wrong with your path! 
 
    if (ftyp & FILE_ATTRIBUTE_DIRECTORY) 
        return true; // this is a directory! 
 
    return false; // this is not a directory! 
} 
 
int loginUser(char* user, char* password) { 
    string dirNameStr(user); 
    if (!dirExists(dirNameStr)){ 
        return 0; 
    } 
    string passFileStr(dirNameStr + "\\password"); 
    TCHAR *passFile = new TCHAR[passFileStr.size() + 1]; // преобразование типа string в tchar 
    passFile[passFileStr.size()] = 0; 
    std::copy(passFileStr.begin(), passFileStr.end(), passFile); // непосредственно преобразование 
    if (!f.Open(passFile, CFile::modeRead, &ex)) { 
        cerr << "Cannot create password file. Try again\n"; 
        exit(EXIT_FAILURE); 
    } 
    char* oldPass = new char[20]; 
    f.Read(oldPass, strlen(password)); 
    f.Close(); 
    oldPass[strlen(password)] = '\0'; 
    if (!strcmp(password, oldPass)){ 
        return 2; 
    } 
    return 1; 
} 
void EmailProcess(void* newS) { 
    int c; 
    char p[200], com[200], num[4]; 
    char* curU; 
    com[0] = '\0'; p[0] = '\0'; 
    strcat(p, "EMail center connected...\n"); 
    send((SOCKET)newS, p, sizeof(p), 0); 
    while ((c = recv((SOCKET)newS, p, sizeof(p), 0) != 0)) { 
        int i = 0; 
        while (p[i] != ' ') { 
            com[i] = p[i]; 
            i++; 
        }; 
        com[i] = '\0'; i++; 
        if (!strcmp(com, "register") || !strcmp(com, "login")) { 
            char user[200], password[200]; 
            char* message; 
            int j = 0; 
            for (; p[i] != ' '; i++) { 
                user[j] = p[i]; 
                j++; 
            } 
            user[j] = '\0'; 
            i++; j = 0; 
            for (; p[i]; i++) { 
                password[j] = p[i]; 
                j++; 
            } 
            password[j] = '\0'; 
            if (!strcmp(com, "register")){ 
                int result = registerUser(user, password); 
                switch (result){ 
                case 0: 
                    message = "Such user doesn't exist"; 
                    break; 
                case 1: 
                    message = "Registration complete"; 
                    cout << "User " << user << " register" << endl; 
                    curU = user; 
                    break; 
                } 
            } 
            if (!strcmp(com, "login")){ 
                int result = loginUser(user, password); 
                switch (result){ 
                case 0: 
                    message = "Incorrect login"; 
                    break; 
                case 1: 
                    message = "Incorrect password"; 
                    break; 
                case 2: 
                    message = "Login success"; 
                    curU = user; 
                    cout << "User " << user << " login" << endl; 
                    break; 
                } 
            } 
            send((SOCKET)newS, message + '\0', strlen(message) + 1, 0); 
        } 
        if (!strcmp(com, "inbox")) { 
            vector<wstring> list; 
            char* result = new char[17]; 
            TCHAR* number = new TCHAR[4]; 
            wstring emails = _T("Your inbox: \n"); 
            char* templateAddr = new char[strlen(curU)]; 
            memcpy(templateAddr, curU, strlen(curU)); 
            templateAddr[strlen(curU)] = '\0'; 
            strcat(templateAddr, "\\inbox\\*.txt"); 
            int count = getInbox(templateAddr, list); 
            for (int i = 0; i < count; i++){ 
                _itow(i + 1, number, 10); 
                emails = emails + number + _T(". ") + list[i].c_str(); 
                emails += '\n'; 
            } 
 
            CharToOem(emails.c_str(), result); 
            send((SOCKET)newS, result + '\0', strlen(result) + 1, 0); 
        } 
        if (!strcmp(com, "read")) { 
            vector<wstring> list; 
            char* result; 
            char* templateAddr = new char[strlen(curU)]; 
            memcpy(templateAddr, curU, strlen(curU)); 
            templateAddr[strlen(curU)] = '\0'; 
            strcat(templateAddr, "\\inbox\\*.txt"); 
            int count = getInbox(templateAddr, list); 
            int j = 0; 
            while (p[i] != '\0') { 
                num[j] = p[i]; 
                i++; 
                j++; 
            }; 
            int readEmail = atoi(num); 
 
            if (readEmail <= count){ 
                char inboxDirAddrF[200]; 
                char* inboxDirAddr = new char[strlen(curU)]; 
                memcpy(inboxDirAddr, curU, strlen(curU)); 
                inboxDirAddr[strlen(curU)] = '\0'; 
                strcat(inboxDirAddr, "\\inbox"); 
                    std::wstring tmpp = list[readEmail - 1].c_str(); 
 
                char restmp[200]; 
                CharToOem(tmpp.c_str(), restmp); 
                strcat(inboxDirAddr, restmp); 
                CString tmpp1; 
                tmpp1 = inboxDirAddr; 
 
                if (f.Open(tmpp1, CFile::modeRead)){ 
                    long iFileSiz = f.GetLength(); 
                    result = new char[iFileSiz]; 
 
                    f.Read(result, iFileSiz); 
                    result[iFileSiz] = '\0'; 
                    cout << result << ". Email successfully deleted" << endl; 
                    f.Close(); 
                } 
            } 
            else{ 
                result = "Incorrect number"; 
            } 
            send((SOCKET)newS, result + '\0', strlen(result) + 1, 0); 
        } 
 
        //send 
        if (!strcmp(com, "send")) { 
            char* result; 
 
            char templateAddrF[200]; 
            char user[200]; 
            char* message; 
            int j = 0; 
            for (; p[i] != ' '; i++) { 
                user[j] = p[i]; 
                j++; 
            } 
            user[j] = '\0'; 
            i++; j = 0; 
            message = &p[i]; 
 
            vector<wstring> list; 
            char* templateAddr = new char[strlen(user)]; 
            memcpy(templateAddr, user, strlen(user)); 
            templateAddr[strlen(user)] = '\0'; 
            strcat(templateAddr, "\\inbox\"); 
                strcat(templateAddr, curU); 
            strcpy(templateAddrF, templateAddr); 
            strcat(templateAddrF, "*.txt"); 
 
            int count = getInbox(templateAddrF, list); 
 
            char* number = new char[4]; 
            itoa(count + 1, number, 10); 
            strcat(templateAddr, number); 
            strcat(templateAddr, ".txt"); 
            delete[]number; 
 
            CString tmpp1; 
            tmpp1 = templateAddr; 
 
            if (f.Open(tmpp1, CFile::modeWrite | CFile::modeCreate)){ 
 
                f.Write(message, strlen(message)); 
                result = message; 
                cout << result << ". Email successfully send" << endl; 
                f.Close(); 
            } 
            else{ 
                result = "Incorrect number"; 
            } 
            send((SOCKET)newS, result + '\0', strlen(result) + 1, 0); 
        } 
 
        if (!strcmp(com, "quit")) { 
            closesocket((SOCKET)newS); 
            exit(EXIT_SUCCESS); 
            com[0] = '\0'; 
        } 
    } 
} 
 
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(EmailProcess, 0, (void*)newS); 
    } 
    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
// client.cpp : Defines the entry point for the console application. 
// 
 
 
#include <winsock2.h> 
#include <iostream> 
#pragma comment(lib,"Ws2_32.lib")
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
using namespace std; 
 
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; 
}
С клиентом никаких проблем, а вот сервер не может скомпилироваться. Вылазит ошибка "LINK : error LNK2001: unresolved external symbol _mainCRTStartup
1>E:\Всё для уроков\Компьютерные Сети\4 laba\client\server_post\Debug\server_post.exe : fatal error LNK1120: 1 unresolved externals" и подсвечиваютяс красным все операторы new.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2017, 14:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает простейший почтовый сервер (C++):

Реализовать простейший почтовый сервер - C++
Доброго времечка! Ребят. Будте так добры. Совсем не успеваю(( Реализовать простейший почтовый сервер и протокол взаимодействия с ним....

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

Простейший почтовый клиент POP3 на С++ - C++
Уважаемый форумчане, мне нужна программа, которая выдает количество писем на почтовом ящике с помощью протокола POP3. Другими словами,...

Хочу создать простейший jabber сервер но возник ряд неопределенностей! - C++
Привет. Чуваки,в двух словах,хочу сделать свой jabber-эхосервер с простейшими функциями(хотя нет,наверно даже без функций :) ) условие...

сервер работает неправильно - C++
Я новичок в С++, написал простой эхо сервер на основе winsock2, и он пашет неправильно. При подключении клиента пишет, что принято 0 байт....

Сервер не работает. Найти ошибки в коде - C++
Уже третий день не могу понять почему код сервера не работает, то этого более мение работал, пока я что - то в коде не напортачил, а сейчас...

4
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,669
11.10.2017, 18:46 #2
Судя по подсветке кода вы потеряли экранирование
0
GbaLog-
Любитель чаепитий
3028 / 1396 / 336
Регистрация: 24.08.2014
Сообщений: 4,962
Записей в блоге: 1
Завершенные тесты: 2
12.10.2017, 05:33 #3
Цитата Сообщение от vxg Посмотреть сообщение
Судя по подсветке кода вы потеряли экранирование
это форум. (см. комментарии в моём блоге.)
Цитата Сообщение от timashenka Посмотреть сообщение
templateAddr[strlen(user)] = '\0';
выход за границы массива, выделяйте strlen + 1 тогда.
Цитата Сообщение от timashenka Посмотреть сообщение
result + '\0'
не то, что вы ожидаете.
Цитата Сообщение от timashenka Посмотреть сообщение
C++
1
2
3
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif
переопределять ключевые слова ой как нехорошо.
возможно, что из-за этого и
Цитата Сообщение от timashenka Посмотреть сообщение
подсвечиваютяс красным все операторы new.
возможно, тип проекта какой-не тот, где есть подобная штука.
Цитата Сообщение от timashenka Посмотреть сообщение
unresolved external symbol _mainCRTStartup
вы точно тот тип проекта создали, который нужен?
тут: https://stackoverflow.com/questions/...rtstartup-masm
возможно, ответ на ваш вопрос.

я говорю "возможно" потому, что со студией никогда не работал.
2
timashenka
1 / 1 / 0
Регистрация: 27.08.2016
Сообщений: 17
18.10.2017, 00:20  [ТС] #4
GbaLog- , А можно еще вопрос? по поводу "read". Я не до конца понял, как должна выглядеть команда посылаемая клиентом для прочтения письма. Я захожу на почту. Проверяю inbox. А как мне прочесть письмо? Подскажите. Я вводил read 1 и вылазила ошибка

Добавлено через 36 минут
фишка в том, что записывает он письма в одну папку, а ищет в другой. не могу понять, где происходит "скос"

Добавлено через 31 минуту
Вопрос с папкой я решил. туплю. А вот проблема начинается тут
C++
1
f.Open(tmpp1, CFile::modeRead)
Он отправляет меня в файл с .asm ращрешением, предварительно выдав access vaolation

Добавлено через 8 минут
А когда я специально введу изначально read и какое нибудь произвольное число, он выдает incorrect number, а потом вообще не признает любой read, всё время выдает Incorrect
0
vxg
18.10.2017, 06:49     Не работает простейший почтовый сервер
  #5

Не по теме:

Фаззинг какой-то

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2017, 06:49
Привет! Вот еще темы с ответами:

Не работает код (формировать запрос и отправлять его на сервер) - C++
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #pragma comment(lib,&quot;ws2_32.lib&quot;) #include&lt;winsock2.h&gt; #include&lt;ws2tcpip.h&gt; void...

TCP клиент-сервер на домашних компах работает а на других нет - C++
Добрый день! Я в сетях совсем нуб. Читаю про TCP-соединение в книге Карпова-Конькова, и пытаюсь запустить пример оттуда. TCP-сервер: ...

Нужен антивирус и для почтовый сервер и для файловый сервер, скажите пожалуйста какой лучшее установить - MS Outlook
Нужен антивирус и для почтовый сервер и для файловый сервер, скажите пожалуйста какой лучшее установить.. Касперский нашел они для одного...

Почтовый сервер - Выбор хостинга
Добрый день. Возникла проблема, помогите разобраться) как узнать, есть ли на нашем сайте почтовый сервер? Необходимо организовать...


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

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

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