Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2012, 21:11   #1
RRt
Новичок
Джуниор
 
Регистрация: 21.08.2012
Сообщений: 2
По умолчанию Конфликт глобальных переменных

Пишу на C++. Версия компилятора 2.95.2 19991024.
Пытаюсь написать программу для отправки сообщений на yandex.ru
Вопрос в том, чтобы ввести строку в консоли - занести её в char* - затем занести её в текст письма strcpy. Для упрощения задачи программа разделена на основную для отправки и конвертация.

Программа переводящая введенную строку в консоли в char* дальше она я так понимаю находится в буфере. Эта часть работает.

Код:
#include <conio.h>
#include <string>
 
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>
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
 
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
hostent *d_addr;
char text[1024];
 
int main()
{
  //инициализируем сокеты
  if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws)))
  { 
    printf("Error in WSAStartup(...)\n");
    return 1;
  }
 
  //создаем сокет
  s = socket (AF_INET,SOCK_STREAM,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");
  send(s,text,strlen(text),0);
  
  strcpy(text,"вставляю свой пароль в base64\r\n");
  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;
}

Последний раз редактировалось RRt; 23.08.2012 в 21:19.
RRt вне форума Ответить с цитированием
Старый 23.08.2012, 21:12   #2
RRt
Новичок
Джуниор
 
Регистрация: 21.08.2012
Сообщений: 2
По умолчанию Конфликт глобальных переменных

Это их объединение, где возникает ошибка

Код:
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#include <string>
 
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
hostent *d_addr;
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,SOCK_STREAM,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");
  send(s,text,strlen(text),0);
  
  strcpy(text,"вставляю свой пароль в base64\r\n");
  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

Ошибка связана с совпадением имен глобальных переменных? Как этого можно избежать?

Последний раз редактировалось RRt; 23.08.2012 в 21:24.
RRt вне форума Ответить с цитированием
Старый 23.08.2012, 21:56   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

сделать свой неймспейс.
можно, наверно, убрать
Код:
using namespace std;
и где надо указывать std явно.
кстати, а кто будет делать WSACleanup?
f.hump вне форума Ответить с цитированием
Старый 23.08.2012, 22:51   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от RRt Посмотреть сообщение
Ошибка связана с совпадением имен глобальных переменных? Как этого можно избежать?
Переименовать переменную. Вам обязательно, чтоб WSADATA было ws? Тем более, что это вам хранить незачем - все равно нигде не нужно.

С другой стороны можете отучиться от вредной привычки писать using namespace std - всегда пишите namespace явно.

Последний раз редактировалось waleri; 23.08.2012 в 22:53.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильное объявление глобальных констант ymnuhj Microsoft Office Excel 5 13.05.2012 23:14
Настройка глобальных параметров каталогов. Тошка Visual C++ 2 18.03.2011 11:23
Использование одной переменной многими без глобальных Horus92 PHP 2 13.01.2011 19:28
Обнуление глобальных переменных в VBA Arkasha69 Microsoft Office Excel 1 06.09.2010 15:06
Правильное объявление глобальных переменных voam Microsoft Office Excel 5 14.05.2010 14:25