![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с сокетами [D7, WinXP]
Sup © (2005-04-13 22:40:00)Пишу программу для массовой рассылки(для хороших целей ;)... В цикле стоит: соединение с сервером,отправка письма,отсоединение. Почему в цикле recv иногда возвращет 0, всё должно быть нормально т.к. smtp-сервер локальный? Отпровляет допустим из 100 всего 87, каждый раз по разному...
Sup (2005-04-18 22:25:00) [1]2Digitman
Да и кстати не надо из себя строить супер героя... Не хочешь не отвечай не кто за яйца не тянет... Я ни чего не потребовал а лишь спросил а тут тебе гадость в лицо... Задолбало! ИМХО Форум для того и сделан чтоб задавать вопросы, возможно и глупые...
Sup (2005-04-18 21:55:00) [2]Если бы не проверял суда бы не постил... Нету ошибок, проверял раз 20 всяко разно... Хрень какаята а не сокеты... Ж(
Digitman (2005-04-18 14:25:00) [3]
> Sup (16.04.05 23:02) [8]
> Попрошу код не трогать
ой-ой-ой !
какие мы нежные !)
чтой-то вдруг ?
> Не реально
а вот мне думается иначе
> сервер локальный
да по барабану какой - хоть локальный , хоть не локальный ..
> обламывается из-за билгейтса
ну конечно ! а кто ж еще виноват, если не "билгейтса"..
> Может исходни скинуть посмотрите
да что на них лупиться, на исходникик твои ?
протоколируй все что посылаешь/принимаешь ... сравнивай с требованиями протокола smtp - скорей всего там, при сравнении, и увидишь свои ошибки
Sup (2005-04-16 23:02:00) [4]Попрошу код не трогать :)
Не реально... сервер локальный(!!!), специально поставил, создал там юзера, письма доходят, только вот через раз... :(
Такая задумка обламывается из-за билгейтса... @#!
Может исходни скинуть посмотрите... Плиииииииииззззззззз... =)
Dmitri_ru (2005-04-16 13:43:00) [5]
> ибо галиматья
Скорее всего в коде :)...
Digitman (2005-04-16 13:21:00) [6]
> из-за перезагрузки
ну это, положим, еще бабушка надвое сказала
а вот это
> Виртуальный канал был прерван .. из-за другой ошибки
вполне реально - сервер, анализируя на предмет соответствия smtp-протоколу то что ты ему прислал в тот или иной момент, сделал вывод о несоответствии полученного протоколу и тут же закрыл соединение по своей инициативе, ибо галиматья
Sup (2005-04-15 23:01:00) [7]Нашел следующие:
WSAECONNABORTED (10053): Виртуальный канал был прерван из-за истечения срока ожидания или из-за другой ошибки. Сетевое соединение прервано из-за перезагрузки.
Как это лечиться???
Sup (2005-04-15 23:00:00) [8]WSAGetLastError показывает 10053
Чтоза нафиг?
Sup (2005-04-14 22:57:00) [9]procedure TForm1.Method1;
var
sSocket: integer;
sock_addr: TSockAddr;
aBuff: array[0..256] of char;
sCmd: string;
iBuff: integer;
i,c: integer;
begin
Progress.Progress:=0;
Progress.MaxProgress:=Str2Int(Count.Text);
for c:=1 to Str2Int(Count.Text) do begin
{$WARNINGS OFF}
sSocket:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
if sSocket=INVALID_SOCKET then begin
exit;
end;
sock_addr.sa_family:=PF_INET;
sock_addr.sin_addr.S_addr:=htons(INADDR_ANY);
sock_addr.sin_addr:=LookupName(Servers.Text);
sock_addr.sin_port:=htons(25);
if connect(sSocket,sock_addr,sizeof(sock_addr))=SOCKET_ERROR then begin
exit;
end;
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
LogOk(aBuff,iBuff);
sCmd:='HELO '+GetLocalHost+#13#10;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
if Copy(aBuff,0,3)<>'250' then begin
LogError(aBuff,iBuff);
CloseSocket(sSocket);
exit;
end;
LogOk(aBuff,iBuff);
{TODO: Fix sFrom}
sFrom:='3xmen@mail.ru';
sCmd:='MAIL FROM:<'+sFrom+'>'+#13#10;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
if Copy(aBuff,0,3)<>'250' then begin
LogError(aBuff,iBuff);
CloseSocket(sSocket);
exit;
end;
LogOk(aBuff,iBuff);
for i:=0 to Abonents.Count-1 do begin
sCmd:='RCPT TO:<'+Abonents.Items[i]+'>'+#13#10;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
if Copy(aBuff,0,3)<>'250' then begin
LogError(aBuff,iBuff);
CloseSocket(sSocket);
exit;
end;
LogOk(aBuff,iBuff);
end;
sCmd:='DATA'+#13#10;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
if Copy(aBuff,0,3)<>'354' then begin
LogError(aBuff,iBuff);
CloseSocket(sSocket);
exit;
end;
LogOk(aBuff,iBuff);
sCmd:=Send.Text;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
sCmd:=#13#10+'.'+#13#10;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
if Copy(aBuff,0,3)<>'250' then begin
LogError(aBuff,iBuff);
CloseSocket(sSocket);
exit;
end;
LogOk(aBuff,iBuff);
sCmd:='QUIT'+#13#10;
CopyMemory(@aBuff,PChar(sCmd),length(sCmd));
LogOk(aBuff,length(sCmd));
WinSock.send(sSocket,aBuff,length(sCmd),0);
iBuff:=recv(sSocket,aBuff,sizeof(aBuff),0);
if Copy(aBuff,0,3)<>'221' then begin
LogError(aBuff,iBuff);
CloseSocket(sSocket);
exit;
end;
CloseSocket(sSocket);
LogOk(aBuff,iBuff);
bOk:=true;
Progress.Progress:=c;
{$WARNINGS ON}
end;
end;
Digitman (2005-04-14 09:24:00) [10]
> Почему в цикле recv иногда возвращет 0
потому что WSAGetLastError
Ozone (2005-04-14 05:13:00) [11]Мож хоть код покажешь, а?