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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2011, 14:18   #1
Olgir
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию Recv() и многострочные ответы

Пишу софтину для почтовой рассылки. Софтина посредством WinSock должна подконнектиться к серверу, авторизоваться и рассылать письма.
Происходит все так:

connect(sock, SAddr, Sizeof(SAddr))
...
msg:='EHLO';
ret:=send(sock,msg,Length(msg),0);
...
ret:=recv(sock,msg,1024,0);

Вот тут то я, собственно и застопорился. Подключаясь к серверу с помощью telnet и отправляя ему "EHLO" я получаю в ответ 5 строк. Функция recv отдает мне в буфер msg (msg: array[0..1023] of AnsiChar) лишь первую строку, оканчивающуюся на CrLf. Если я пытаюсь вызвать recv еще раз, программа наглухо виснет - оно и понятно, сервер ведь больше ничего не отвечает.
Внимание вопрос! Куда делись оставшиеся 4 строки ответа и как их получить в буфер msg?

Ковыряю гугл второй день, все глухо, во всех примерах по Winsock ничего подобного не объясняется, да и вообще, поверхностные они какие-то...

И да, не посылайте меня, пожалуйста, в сторону инди и TCPClient. Я хочу сделать все именно на Winsock и никак иначе. Версия библиотеки - 2.0.

Буду очень благодарен, если посоветуете ХОРОШЕЕ руководство по Winsock, желательно для Delphi, желательно на русском языке.

Заранее спасибо!

UPD: Я дико извиняюсь - изначально неверно сформулировал проблему! Правильная формулировака ниже!

Последний раз редактировалось Olgir; 29.08.2011 в 16:48.
Olgir вне форума Ответить с цитированием
Старый 29.08.2011, 16:15   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
лишь первую строку, оканчивающуюся на CrLf
А значение ret после возврата из recv() соответствует длине принятой строки, включая crlf ?
mss вне форума Ответить с цитированием
Старый 29.08.2011, 16:42   #3
Olgir
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
А значение ret после возврата из recv() соответствует длине принятой строки, включая crlf ?
Сейчас начал проверять и обнаружил любопытную штуку - на самом деле я получал предыдущее сообщение, отправленное мне сервером. Т.е. я извиняюсь, но изначально неверно сформулировал проблему. Выходит вот так:

Соединяюсь с сервером, получаю приветствие от него.
Код:
connect(sock, SAddr, Sizeof(SAddr));
ret:=recv(sock,msg,1024,0);
msg: 220 SMTP technoac.ru ESMTP #10#13
ret: 28

Отправляю приветствие серверу.
Код:
msg:='EHLO';
ret:=send(sock,msg,Length(msg),0);
msg: EHLO
ret: 1024
или 4, если меняю массив msg на строку.

Пытаюсь получить ответ.
Код:
ret:=recv(sock,msg,1024,0);
На этом месте функция recv() виснет и не отдает управление. Что-то я явно делаю не так, но что?
В этом месте как раз и предполагаются искомые 5 строк текста, вместо этого я вообще ничего не получаю. А ведь сервер, по крайней мере, должен ответить "5хх", если команда дошла неверно.

Последний раз редактировалось Olgir; 29.08.2011 в 16:56.
Olgir вне форума Ответить с цитированием
Старый 29.08.2011, 17:07   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Что-то я явно делаю не так, но что?
ЛЮБОЕ сообщение, будь то приветствие, команда клиента серверу или отклик сервера на команду, в соответствии с SMTP должно завершаться CRLF.

А у тебя его и в помине нет.

Т.е. сервер ждет когда ты сподобишься послать ему CRLF, после чего он начнет анализировать поданную ему команду и возвращать результат, если команда корректна в данном контексте.

А что, твой сервер разве не ждет в команде EHLO доменное имя (или адрес) хоста-клиента, здоровающегося с сервером ?

Последний раз редактировалось mss; 29.08.2011 в 17:10.
mss вне форума Ответить с цитированием
Старый 29.08.2011, 23:58   #5
Olgir
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
ЛЮБОЕ сообщение, будь то приветствие, команда клиента серверу или отклик сервера на команду, в соответствии с SMTP должно завершаться CRLF.

А у тебя его и в помине нет.
О, спасибо, не подумал об этом! Завтра доберусь до работы, попробую!

Цитата:
Сообщение от mss Посмотреть сообщение
А что, твой сервер разве не ждет в команде EHLO доменное имя (или адрес) хоста-клиента, здоровающегося с сервером ?
Не могу сказать, почему так, но нашему серверу все равно, что там после ехло будет. Вероятно из-за того, что дальше пойдем авторизация методом plain.
Olgir вне форума Ответить с цитированием
Старый 30.08.2011, 09:19   #6
Olgir
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию

Действительно, все дело было в том, что я не передавал #10#13 в конце строки! Спасибо за помощь, проблема решена!
Olgir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многострочные Item'ы в CheckListBox'е ex.cluz Компоненты Delphi 0 09.06.2010 22:10
recv() Артэс C/C++ Сетевое программирование 7 15.01.2010 14:51
многострочные коментарии Vano-sie72 Win Api 2 31.05.2009 21:18
Многострочные ячейки в таблице Sinker БД в Delphi 5 29.03.2009 18:31
Многострочные надписи в узлах VirtualDrawTree Mitron Общие вопросы Delphi 4 01.02.2008 23:06