Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение почты через WSA 
:(
    Опции темы
Akella
Дата 24.5.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Код

unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, winsock, StdCtrls;

type
  TTCPClientForm = class(TForm)
    btRecvMessages: TButton;
    edServer: TEdit;
    Label1: TLabel;
    mmLog: TMemo;
    Label2: TLabel;
    Label3: TLabel;
    edPort: TEdit;
    procedure btRecvMessagesClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  TCPClientForm: TTCPClientForm;

implementation

{$R *.dfm}

procedure TestWinSockError(S:String);
var
 iErr:Integer;
 sFullErr:String;
begin
 sFullErr:='Неизвестная ошибка';
 iErr:=WSAGetLastError();

 case iErr of
  WSANOTINITIALISED: sFullErr:='Нужно сначала вызвать функцию WSASturtup, а потом создавать сокет';
    WSAENETDOWN: sFullErr:='Cвязь нарушена, возможные причины - отошёл кабель или отключились от Интернета';
    WSAEADDRINUSE: sFullErr:='Указанный адрес уже используется';
    WSAEFAULT: sFullErr:='Параметры name и namelen не соответствуют выбранной адресации. Параметр namelen может быть меньше необходимого значения, а name содержать некорректные данные';
    WSAEINPROGRESS: sFullErr:='Выполняется операция в блокирующем режиме. Вы уже запустили на выполнение какую-то функцию и нужно дождаться завершения её работы';
    WSAEINVAL: sFullErr:='Сокет уже связан с адресом';
    WSAENOBUFS: sFullErr:='Недостаточно буферов, слишком много соединений';
    WSAENOTSOCK: sFullErr:='Неверный дескриптор сокета';
  WSAEISCONN: sFullErr:='Сокет уже подключён';
  WSAEMFILE: sFullErr:='Нет больше доступных дескрипторов';
 end;

 MessageBox(0, PChar('Ошибка в функции '+S+' - '+sFullErr), 'Ошибка', 0);
end;

function TestFuncError(iErr:Integer; FuncName:String):Boolean;
begin
 Result:=false;
 if iErr = SOCKET_ERROR then
  begin
   TestWinSockError(FuncName);
   Result:=true;
  end;
end;

function LookupName(name:String): TInAddr;
var
 HostEnt: PHostEnt;
 InAddr: TInAddr;
begin
 if name[4]='.' then
  InAddr.s_addr := inet_addr(PChar(name))
 else
  begin
  HostEnt := gethostbyname(PChar(name));
  FillChar(InAddr, SizeOf(InAddr), 0);
  if HostEnt <> nil then
   begin
    with InAddr, HostEnt^ do
     begin
      S_un_b.s_b1 := h_addr^[0];
      S_un_b.s_b2 := h_addr^[1];
      S_un_b.s_b3 := h_addr^[2];
      S_un_b.s_b4 := h_addr^[3];
     end;
   end
  end;
  Result := InAddr;
end;

function GetLocalHost: string;
var
 sh : array [0..255] of char;
begin
 if gethostname(sh, 255)=0 then
  Result := StrPas(sh)
 else
  Result := '';
end;

procedure SendStr(s:TSocket; str:String);
var
 sRecvBuff : array [0..255] of char;
 TempStr : AnsiString;
begin
 TempStr:=str+#13+#10;
 CopyMemory(@sRecvBuff, PChar(TempStr), Length(TempStr));
 TestFuncError(send(s, sRecvBuff, Length(TempStr), 0), 'Send Attachment');
 TCPClientForm.mmLog.Lines.Add('>'+Copy(TempStr, 1, Pos(#13, TempStr)));
end;

procedure GetStr(s:TSocket);
var
 sRecvBuff : array [0..5000] of char;
 TempStr : AnsiString;
begin
 TestFuncError(recv(s, sRecvBuff, SizeOf(sRecvBuff), 0), 'Ошибка выхода');
 TempStr:=sRecvBuff;
 while Pos(#13, TempStr)>0 do
  begin
   TCPClientForm.mmLog.Lines.Add('<'+Copy(TempStr, 1, Pos(#13, TempStr)));
   Delete(TempStr, 1, Pos(#13, TempStr)+1);
  end;
 Application.ProcessMessages;
end;

procedure TTCPClientForm.btRecvMessagesClick(Sender: TObject);
var
 wData : WSADATA;
 sServerListen: TSOCKET;
 server_addr : sockaddr_in;
begin
 mmLog.Clear;

 // Загрузка WinSock
 if WSAStartup(MAKEWORD(1,1), wData) <> 0 then
    begin
   MessageBox(0, 'Не могу загрузить WinSock', 'Ошибка', 0);
   exit;
    end;

 // Создание сокета
 sServerListen := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
 if sServerListen = INVALID_SOCKET then
  begin
   MessageBox(0, 'Ошибка создания сокета', 'Ошибка', 0);
   exit;
  end;

 // Запонение структуры адреса
 server_addr.sin_addr.s_addr := htonl(INADDR_ANY);
 server_addr.sin_family := AF_INET;
 server_addr.sin_port := htons(StrToInt(edPort.Text));
 server_addr.sin_addr := LookupName(edServer.Text);

 if (connect(sServerListen, server_addr, sizeof(server_addr)) = SOCKET_ERROR) then
  begin
   TestWinSockError('Connect');
   exit;
  end;

 GetStr(sServerListen);

 SendStr(sServerListen, 'user smirnandr');
 GetStr(sServerListen);

 SendStr(sServerListen, 'pass dfgfdggtf');
 GetStr(sServerListen);

 SendStr(sServerListen, 'list');
 Sleep(1000);
 GetStr(sServerListen);

 SendStr(sServerListen, 'retr 1');
 Sleep(1000);
 GetStr(sServerListen);

 SendStr(sServerListen, 'dele 1');
 GetStr(sServerListen);

 SendStr(sServerListen, 'quit');

 CloseSocket(sServerListen);
end;

end.

PM MAIL   Вверх
Akella
  Дата 24.5.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Форма

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  111.JPG
PM MAIL   Вверх
Rouse_
Дата 24.5.2005, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



А анализ ответов? К примеру ну нет на сервере ни одного письма? smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
RA
Дата 24.5.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



А какже Аттачи ? smile
PM   Вверх
Akella
Дата 24.5.2005, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Помотрите, что выдаёт Log, можно ведь анализировать
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.