![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Пишу софтину для почтовой рассылки. Софтина посредством WinSock должна подконнектиться к серверу, авторизоваться и рассылать письма.
Происходит все так: Код:
connect(sock, SAddr, Sizeof(SAddr)) ... msg:='EHLO'; ret:=send(sock,msg,Length(msg),0); ... ret:=recv(sock,msg,1024,0); Внимание вопрос! Куда делись оставшиеся 4 строки ответа и как их получить в буфер msg? Ковыряю гугл второй день, все глухо, во всех примерах по Winsock ничего подобного не объясняется, да и вообще, поверхностные они какие-то... И да, не посылайте меня, пожалуйста, в сторону инди и TCPClient. Я хочу сделать все именно на Winsock и никак иначе. Версия библиотеки - 2.0. Буду очень благодарен, если посоветуете ХОРОШЕЕ руководство по Winsock, желательно для Delphi, желательно на русском языке. Заранее спасибо! ![]() UPD: Я дико извиняюсь - изначально неверно сформулировал проблему! Правильная формулировака ниже! Последний раз редактировалось Olgir, 29.08.2011 в 16:48. |
|
#2
|
|||
|
|||
|
а как ты видишь, что тебе вернули только одну строку???
есть подозрение, что ты просто неправильно обрабатываешь ответ. |
|
#3
|
|||
|
|||
|
Цитата:
"250 Тут некоторый ответ #13#10 00000000000000000000000000000... Все как положено - код, потом текст, потом перенос строки. Но дальше нулями забито все до конца массива, т.е., из пяти строк в мой массив пришла лишь одна. Массив, напоминаю, msg: array[0..1023] of AnsiChar; Цитата:
Еще читал, что к данным пришедшим на сокет можно обращаться с помощью ReadFile. Программа компилируется, никаких исключений функция не генерит, она просто ничего не читает. Вобщем, хотелось бы совет, желательно с примером, а еще лучше, какое-нибудь хорошее чтиво по сокетам... UPD: я дико извиняюсь, изначально неверно сформулировал проблему! Только что нашел небольшой косяк, немного переписал код. Сейчас переформулирую... Соединяюсь с сервером, получаю приветствие от него. Код:
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: 4 Пытаюсь получить ответ. Код:
ret:=recv(sock,msg,1024,0); На этом месте функция recv() виснет и не отдает управление. Что-то я явно делаю не так, но что? В этом месте как раз и предполагаются искомые 5 строк текста, вместо этого я вообще ничего не получаю. Последний раз редактировалось Olgir, 29.08.2011 в 16:49. |
|
#4
|
||||
|
||||
|
Код:
var
WSAData: TWSAData;
FSocket: TSocket;
FAddr: sockaddr_in;
InAddr: in_addr;
HostEnt: PHostEnt;
Buf: array [0..$ff] of Char;
Count: Integer;
begin
WSAStartup($0202, WSAData);
try
FSocket:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if FSocket=INVALID_SOCKET then
raise Exception.Create('socket(): '+SysErrorMessage(WSAGetLastError));
FAddr.sin_family:=AF_INET;
FAddr.sin_port:=htons(25);
FillChar(InAddr, SizeOf(InAddr), 0);
HostEnt:=gethostbyname('smtp.mail.ru');
if HostEnt<>nil then
begin
InAddr.S_un_b.s_b1:=HostEnt^.h_addr^[0];
InAddr.S_un_b.s_b2:=HostEnt^.h_addr^[1];
InAddr.S_un_b.s_b3:=HostEnt^.h_addr^[2];
InAddr.S_un_b.s_b4:=HostEnt^.h_addr^[3];
FAddr.sin_addr:=InAddr;
end else raise Exception.Create('gethostbyname()');
if connect(FSocket, FAddr, SizeOf(FAddr))<>0 then
raise Exception.Create('connect(): '+SysErrorMessage(WSAGetLastError));
try
buf:='EHLO NumLock'#13#10;
Count:=14;
send(FSocket, Buf, Count, 0);
// подождем, чтобы одной командой recv все считать
Tag:=GetTickCount;
while GetTickCount-DWORD(Tag)<2000 do Application.ProcessMessages;
Count:=recv(FSocket, Buf, $100, 0);
if Count=SOCKET_ERROR then
raise Exception.Create('recv(): '+SysErrorMessage(WSAGetLastError));
Memo1.Lines.Add(Copy(Buf, 0, Count-1));
finally
closesocket(FSocket);
end;
finally
WSACleanup;
end;
end; |
|
#5
|
|||
|
|||
|
NumLock, спасибо, завтра приду на работу, разберу это).
UPD: кажется понял свою ошибку. Нужно ставить CRLF в конце сообщения, а я этого не сделал. Последний раз редактировалось Olgir, 30.08.2011 в 00:02. |
|
#6
|
|||
|
|||
|
Все работает, проблема решена. Действительно, все дело в том, что я не передавал #10#13 в конце строки.
NumLock, спасибо за дельный пример! . |