Новичок
Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.8.2012
Репутация: нет Всего: нет
|
Это первая моя программа, поэтому если можно ответы простым языком Вопрос был в том, чтобы ввести строку в консоли - занести её в char* - затем занести её в текст письма strcpy. Для упрощения задачи программа разделена на основную для отправки и конвертация. Спасибо Cheloveck за ссылку, как поставить тебе + за ответ? Из прочитанного получилось следующее: Программа переводящая введенную строку в консоли в char* дальше она я так понимаю находится в буфере. Эта часть работает. Код | #include <conio.h> //библиотека, необходимая для работы оператора getch() и printf() #include <string> //библиотека, необходимая для работы объекта string и cin
using namespace std;
int main () { char * cstr; string str; cin >> str; cstr = new char [str.size()+1]; strcpy (cstr, str.c_str()); printf("strcpy - %s", cstr); delete[] cstr; printf("\n"); printf("Press any key\n"); getch(); //команда задержки экрана
return 0; }
|
Далее основная программа, для отправки писем. Эта часть тоже работает. Код | #include <conio.h> //библиотека, необходимая для работы оператора getch() #include <stdio.h> #include <windows.h> #include <winsock.h> //подключение готовых библиотек типа winsock, с ф-ми для отправления и приема сообщений по сети
WSADATA ws; //интерфейс между приложением и транспортным протоколом SOCKET s; //объявляем дескриптор, который может получать или отправлять данные struct sockaddr_in addr; //объявим переменную для хранения адреса hostent *d_addr; //структура, в которую будет помещен IP адрес, при возврате char text[1024];
int main() { //инициализируем сокеты if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) //инициализируем сокеты { printf("Error in WSAStartup(...)\n"); return 1; }
//создаем сокет s = socket (AF_INET, //протокол (TCP/IP, IPX...) SOCK_STREAM, //тип сокета (SOCK_STREAM/SOCK_DGRAM) 0 //для Windows приложений может быть 0 ); if (s == INVALID_SOCKET) { //сообщение с номером ошибки printf("Error in socket(...)\n"); return 1; } //получаем адрес сервера d_addr = gethostbyname ("smtp.yandex.ru"); //d_addr = gethostbyname ("smtp.mail.ru");++++++++ if (d_addr==NULL) { printf("Error in gethostbyname(...)\n"); return 1; };
//заполняем параметры адреса addr.sin_family = AF_INET; addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr); addr.sin_port = htons (25);
//устанавливаем соединение if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr, sizeof (addr)))) { printf("Error in connect(...)\n"); return 1; }
//ждем ответ от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//приветствуем сервер strcpy(text,"EHLO smtp.yandex.ru\r\n"); //strcpy(text,"HELO smtp.mail.ru\r\n");++++++++++++++ send(s,text,strlen(text),0); //int send(_in SOCKET s,_in const char *buf,_in int len,_in int flags); printf("send - %s", text); strcpy(text,"AUTH LOGIN\r\n"); //const char* - это константная строка, то есть та, которую изменить нельзя в принципе, например если в функции в ка-ве параметра стоит const char*, то можно ей передать не переменную, а её значение, например:strcpy(str,"test");strcpy - функция для копирования строки. в строку char* str копируется константная строка "test" send(s,text,strlen(text),0); strcpy(text,"вставляю свой логин в base64\r\n");//здесь логин в base64 кодировке send(s,text,strlen(text),0); strcpy(text,"вставляю свой пароль в base64\r\n");//здесь пароль в base64 кодировке send(s,text,strlen(text),0); //ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//начинаем отправлять конверт состоящий из полей //MAIL FROM: и RCPT TO: После каждого поля ждем //подтверждение
//сообщаем отправителя strcpy(text,"MAIL FROM: указываю адрес отправителя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//сообщаем получателя strcpy(text, "RCPT TO: указываю адрес получателя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//подаем команду, что готовы начать передачу письма strcpy(text,"DATA\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); //передаем заголовок
//от кого письмо strcpy(text,"FROM: указываю адрес отправителя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//кому письмо strcpy(text,"TO: указываю адрес получателя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); //тема письма strcpy(text,"SUBJECT: test\r\n\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//текст письма strcpy(text,"text, текст\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//говорим, что закончили strcpy(text,"\r\n.\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); recv(s,text,sizeof(text),0); printf("recv - %s", text);
//прощаемся с сервером strcpy(text,"QUIT"); send(s,text,strlen(text),0); printf("send - %s", text);
//закрываем сокет closesocket(s); printf("\n"); printf("Press any key\n"); getch(); //команда задержки экрана
return 0; }
|
Это их объединение, где возникает ошибка Код | #include <conio.h> //библиотека, необходимая для работы оператора getch() и printf() #include <stdio.h> #include <windows.h> #include <winsock.h> //подключение готовых библиотек типа winsock, с ф-ми для отправления и приема сообщений по сети #include <string> //библиотека, необходимая для работы объекта string и cin
WSADATA ws; //интерфейс между приложением и транспортным протоколом SOCKET s; //объявляем дескриптор, который может получать или отправлять данные struct sockaddr_in addr; //объявим переменную для хранения адреса hostent *d_addr; //структура, в которую будет помещен IP адрес, при возврате char text[1024];
using namespace std;
int main() { char * cstr; string str; //инициализируем сокеты if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) //инициализируем сокеты { printf("Error in WSAStartup(...)\n"); return 1; }
//создаем сокет s = socket (AF_INET, //протокол (TCP/IP, IPX...) SOCK_STREAM, //тип сокета (SOCK_STREAM/SOCK_DGRAM) 0 //для Windows приложений может быть 0 ); if (s == INVALID_SOCKET) { //сообщение с номером ошибки printf("Error in socket(...)\n"); return 1; } //получаем адрес сервера d_addr = gethostbyname ("smtp.yandex.ru"); if (d_addr==NULL) { printf("Error in gethostbyname(...)\n"); return 1; };
//заполняем параметры адреса addr.sin_family = AF_INET; addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr); addr.sin_port = htons (25);
//устанавливаем соединение if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr, sizeof (addr)))) { printf("Error in connect(...)\n"); return 1; }
//ждем ответ от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//приветствуем сервер strcpy(text,"EHLO smtp.yandex.ru\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); strcpy(text,"AUTH LOGIN\r\n"); send(s,text,strlen(text),0); strcpy(text,"вставляю свой логин в base64\r\n");//здесь логин в base64 кодировке send(s,text,strlen(text),0); strcpy(text,"вставляю свой пароль в base64\r\n");//здесь пароль в base64 кодировке send(s,text,strlen(text),0); //ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//начинаем отправлять конверт состоящий из полей //MAIL FROM: и RCPT TO: После каждого поля ждем //подтверждение
//сообщаем отправителя strcpy(text,"MAIL FROM: указываю адрес отправителя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//сообщаем получателя strcpy(text, "RCPT TO: указываю адрес получателя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text);
//подаем команду, что готовы начать передачу письма strcpy(text,"DATA\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); //передаем заголовок
//от кого письмо strcpy(text,"FROM: указываю адрес отправителя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text);
//кому письмо strcpy(text,"TO: указываю адрес получателя\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); //тема письма strcpy(text,"SUBJECT: test\r\n\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); cin >> str; //ввожу текст письма cstr = new char [str.size()+1]; //заполняю буфер текстом письма //текст письма strcpy(cstr, str.c_str()); //отправляю текст письма, здесь нужно подставить значение со строковой переменной!!! strcat(cstr,"\n"); send(s,text,strlen(text),0); printf("send - %s", text); delete[] cstr; //говорим, что закончили strcpy(text,"\r\n.\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); recv(s,text,sizeof(text),0); printf("recv - %s", text);
//прощаемся с сервером strcpy(text,"QUIT"); send(s,text,strlen(text),0); printf("send - %s", text);
//закрываем сокет closesocket(s); printf("\n"); printf("Press any key\n"); getch(); //команда задержки экрана
return 0; }
|
Ошибка выглядит следующим образом: g++.exe -x c++ -c D:\CREATE~1\C__~1\MAIL~1.CPP -o D:\CREATE~1\C__~1\MAIL~1.o -Wall -fpermissive D:\CREATE~1\C__~1\MAIL~1.CPP:7: `struct WSADATA ws' redeclared as different kind of symbol ..\lib\gcc-lib\i386-mingw32\2.95.2\..\..\..\..\include\iostream.h:39: previous declaration of `class istream & ws(istream &)' Failure Как я понял ошибка связана с пространством имен, пересекаются имена?
|