Показать сообщение отдельно
  #4  
Старый 29.08.2011, 17:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием