Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.175] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет. Недавно начал разбираться с сокетами, написал пару простых программ для обмена данными по локальной сети. Сейчас захотел попробовать подключиться к smtp-серверу для отправки email письма и возникли некоторые сложности, решения которых я не нашел в google.
DWORD SendMessage(const char * email, const char * msg, const char * from) { WSADATA _wsa; WSAStartup(MAKEWORD(2,2), &_wsa); hostent * h; int handle = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(handle <= 0) printf("Error with creation socket %i", GetLastError()); char * em = getSMTPServer(email); h = gethostbyname(em); delete em; if(h == NULL) { printf("ERROR WITH GETTING HOSTBYNAME - %i\n", GetLastError()); closesocket(handle); return EXIT_FAILURE; } sockaddr_in destination; destination.sin_family = AF_INET; destination.sin_port = htons(25); destination.sin_addr.s_addr = *((unsigned long *) h->h_addr); if(connect(handle,(const sockaddr *)&destination, sizeof(sockaddr_in) == SOCKET_ERROR)) { printf("ERROR WITH CONNECT SMTP-SERVER - %i\n", GetLastError()); closesocket(handle); return EXIT_FAILURE; } ... WSACleanup(); } Функция getSMTPServer() самописная и возвращает smtp-сервер, основываясь на email-адресе. После вызова функции connect() возвращается SOCKET_ERROR и GetLastError() == 10014 |
Сообщ.
#2
,
|
|
|
Тебе интересно чисто разобраться?
Есть два момента, я не знаю с кем ты хочешь связать по 25 порту, но это обычный SMTP вроде и многие так уже не работают, а только с SSL ну и другим портом. И еще если ты пользуешься например gmail или еще кем не своим, полезь в настройки почты и сделай доступным для внешних программ. |
Сообщ.
#3
,
|
|
|
Цитата linuxoid @ После вызова функции connect() возвращается SOCKET_ERROR и GetLastError() == 10014 А что означает эта ошибка, ты посмотрел ? Попробуй так: .. if(connect(handle,(const sockaddr *)&destination, sizeof(destination) == SOCKET_ERROR)) .. connect, пример Исходники sources.ru |
Сообщ.
#4
,
|
|
|
Цитата ter_nk_ @ Тебе интересно чисто разобраться? Есть два момента, я не знаю с кем ты хочешь связать по 25 порту, но это обычный SMTP вроде и многие так уже не работают, а только с SSL ну и другим портом. И еще если ты пользуешься например gmail или еще кем не своим, полезь в настройки почты и сделай доступным для внешних программ. не просто разобраться, а сделать так, чтобы письмо все-таки отправилось куда нужно. Наткнулся на статью, в которой говорилось что smtp использует 25 порт, вот я и пробую, возможно, это и правда уже неактуально и следует пробовать другой порт. Но если я буду использовать порт с ssl тогда мне нужно использовать шифрование. Я хотел написать на чистом С, без подключения сторонних библиотек. |
Сообщ.
#5
,
|
|
|
Вполне возможно что самописная функция неверно формирует аргумент для gethostbyname()
Проверьте - поле h_addr структуры hostent Скажем распечатайте. |
Сообщ.
#6
,
|
|
|
Цитата linuxoid @ не просто разобраться, а сделать так, чтобы письмо все-таки отправилось куда нужно. Наткнулся на статью, в которой говорилось что smtp использует 25 порт, вот я и пробую, возможно, это и правда уже неактуально и следует пробовать другой порт. Но если я буду использовать порт с ssl тогда мне нужно использовать шифрование. Я хотел написать на чистом С, без подключения сторонних библиотек. А ты пробовал смотреть не статью, а конкретные настройки сервера, они могут убирать такие дыры безопасности, кто сейчас 25 порт использует? |
Сообщ.
#7
,
|
|
|
Цитата ter_nk_ @ А ты пробовал смотреть не статью, а конкретные настройки сервера, они могут убирать такие дыры безопасности, кто сейчас 25 порт использует? я попробовал. Можно законнектится на smtp.mail.ru:25. С операцией "connect" нет проблем. |
Сообщ.
#8
,
|
|
|
Цитата ЫукпШ @ я попробовал. Можно законнектится на smtp.mail.ru:25. С операцией "connect" нет проблем. С gmail это не пройдет. |
Сообщ.
#9
,
|
|
|
Согласен, что почтовик может и требовать аутентификации, и совсем на другой порт и прочая.
Но в любом случае коннект все равно проходил бы, если связка Ip:port была бы реальной. А тут сам коннект не проходит - т.е. первый SYN не находит адресат... |
Сообщ.
#10
,
|
|
|
Цитата ter_nk_ @ Цитата ЫукпШ @ я попробовал. Можно законнектится на smtp.mail.ru:25. С операцией "connect" нет проблем. С gmail это не пройдет. Предлагаешь все сервера проверять ? |
Сообщ.
#11
,
|
|
|
Извините не знал. У них в настройках для клиента указан только порт с SSL, да я думал на хрена типа оставлять обычный.
|
Сообщ.
#12
,
|
|
|
Именно поэтому я считаю что засада в формировании адреса почтовика...
|
Сообщ.
#13
,
|
|
|
Доброго всем дня. Не был дома несколько дней, не мог отвечать вам на форуме. По поводу ваших доводов о неправильной работе getSMTPServer(const char * email);
Возвращаемое значение функцией перед инициализацией gethostbyname(); Прикреплённая картинка
структура hostent после инициализации: Прикреплённая картинка
Кажется, что все в порядке с этим |
Сообщ.
#14
,
|
|
|
И тем не менее для коннекта эта ошибка обозначает неверно сформированный адрес назначения.
У меня вызывает подозрение приведение типа destination.sin_addr.s_addr = *((unsigned long *) h->h_addr); Такая запись характерна для связывания локального сокета для BIND на сервере. Попробуйте привести к типу struct in_addr таким образом destination.sin_addr = * ((struct in_addr *) h-> h_addr); И еще проверка - просто возьмите значение возвращенное значение h_addr и посмотрите - получается ли IP-адрес назначения. Адрес идет уже в сетевом порядке. |
Сообщ.
#15
,
|
|
|
Цитата Oleg2004 @ И тем не менее для коннекта эта ошибка обозначает неверно сформированный адрес назначения. У меня вызывает подозрение приведение типа destination.sin_addr.s_addr = *((unsigned long *) h->h_addr); Такая запись характерна для связывания локального сокета для BIND на сервере. Попробуйте привести к типу struct in_addr таким образом destination.sin_addr = * ((struct in_addr *) h-> h_addr); И еще проверка - просто возьмите значение возвращенное значение h_addr и посмотрите - получается ли IP-адрес назначения. Адрес идет уже в сетевом порядке. Попробовал изменить преобразование типов как указали Вы, но результата это особого не дало. Структура sin_addr заполнилась тем же самым IP-адресом, с которым я и пытался установить соединение. [attach=#0][/attach] Кстати, попробовал вывести на консоль значение h->h_addr; Результат следующий: [attach=#1][/attach] Возможно, в этом и таится проблема? или такое значение это норма? Прикреплённая картинка
Прикреплённая картинка
|