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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2009, 11:13   #1
Leloush
Пользователь
 
Регистрация: 31.01.2009
Сообщений: 32
По умолчанию WinSock2

Проблема, немогу разобратся с винсок... нужно создать сокет, привязать его к локалке(то есть серверный режим так сказать), и начать прослушку... пакеты выводить в мемо(нерасшифрованые)... приму любою помощь, побольше критике чтоб получше понял... впервые работаю с сетью на уровне АПИ к прямому доступу к драйверу, так что строго не судите )
Вложения
Тип файла: zip 000.zip (205.8 Кб, 27 просмотров)
Leloush вне форума Ответить с цитированием
Старый 14.06.2009, 12:51   #2
Leloush
Пользователь
 
Регистрация: 31.01.2009
Сообщений: 32
По умолчанию

ну что вы люди, наверняка кто-нибудь знает, неполенитесь ответить... если кто-то непонял что именно я хочу(вполне возможно что код запутан и сразу непонять что я хотел).. мне надо инициализировать библиотеку, создать сокет, привязать к моей сетевухе и поставит режим приема пакетов в режиме при котором пакеты проходят через мое приложение к другому(вроде блокирующий режим сокета), например при конекте к рамблеру я хочу получить данные из пакетов которые ремот-хост отпрявляет моему браузеру... по сути это прозрачный снифер на TCP сокетах с привязкой по порту
Leloush вне форума Ответить с цитированием
Старый 14.06.2009, 12:57   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

http://delphikingdom.ru/asp/viewitem.asp?catalogid=1021
http://delphikingdom.ru/asp/viewitem.asp?catalogid=1060
Somebody вне форума Ответить с цитированием
Старый 14.06.2009, 13:13   #4
Leloush
Пользователь
 
Регистрация: 31.01.2009
Сообщений: 32
По умолчанию

Код:
unit WinSocket;
interface

uses WinSock2,Classes,Messages;

type
  TScaner = class(TThread)
  protected
    procedure Execute; override;
    procedure ShowPack;
  end;

var
  Scaner : TScaner;
  Sock : TSocket;
  SockAddr:TSockAddr;
  ws:TWSAData;
  Buf:array[0..255] of Char;

procedure TScaner.Execute;
begin
  if WSAStartup($202,ws)<>0 then ShowMessage('Îøèáêà èíèöèàëèçàöèè áèáëèîòåêè!'); //Èíèöèàëèçàöèÿ WinSock2
  Sock:=Socket(TCP_SOCK,SOCK_STREAM,IPPROTO_IP); // Ñîçäàíèå ñîêåòà
  if Sock=INVALID_SOCKET then ShowMessage('Îøèáêà ñîçäàíèÿ ñîêåòà!');//Ïðîâåðêà ñîçäàíèÿ ñîêåòà
  SockAddr.sin_family:=AF_INET; //------------------------------------
  SockAddr.sin_port:=htons(Word(1234));//Çàïîëíÿþ ñòðóêòóðó äëÿ ñîêåòà
  SockAddr.sin_addr.s_addr := htonl(INADDR_ANY);//--------------------
  if bind(Sock, @SockAddr, sizeof(SockAddr))=Socket_Error then ShowMessage('Îøèáêà ïðèâÿçêè ñîêåòà ê èíòåðôåéñó!') else
  Synchronize(ShowPack);//Ïðèâÿçêà ñîêåòà ê èíòåðôåéñó, ïðîâåðêà ïðèâÿçêè, ñèíõðîíèçàöèÿ ñ ïðîöåäóðîé îáðàáîòêè ïàêåòîâ

  closesocket(Sock);//çàêðûòèå ñîêåòà

  Terminate;//îñòàíîâêà ïîòîêà
end;


procedure TScaner.ShowPack;
var

begin
recv(Sock,Buf,sizeof(Buf),0);//ïîëó÷åíèå ïàêåòà
PacketMemo.Lines.Add(string(Buf2));//âûâîä ñîäåðæèìîãî â Memo
end;


begin

  //ñîçäàòü ïðîöåññ, íî ïîêà íå çàïóñêàòü
  Scaner:=TScaner.Create(true);
  //Îñâîáîäèòü ïàìÿòü ïðè ïðåðûâàíèè ïðîöåññà
  Scaner.FreeOnTerminate:=true;
  //óñòàíîâèòü ïðèîðèòåò
  Scaner.Priority:=tpLowest;
  //çàïóñòèòü ïðîöåññ
  Scaner.Resume;

end.
Интересует правильность привязки к моей сетевухе и получение данных из пакета, все верно реализовано или глупость?
Leloush вне форума Ответить с цитированием
Старый 14.06.2009, 13:57   #5
Leloush
Пользователь
 
Регистрация: 31.01.2009
Сообщений: 32
По умолчанию

Код:
unit MainUnit;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    redt: TRichEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   TScaner = class(TThread)
  protected
    procedure Execute; override;
    procedure ShowPack;
  end;

var
  Form1: TForm1;
   Scaner : TScaner;
  Sock : TSocket;
  SockAddr:TSockAddr;
  ws:TWSAData;
  Buf:array[0..255] of Char;
implementation

{$R *.dfm}

procedure TScaner.Execute;
begin
  if WSAStartup($202,ws)<>0 then ShowMessage('Îøèáêà èíèöèàëèçàöèè áèáëèîòåêè!'); //Èíèöèàëèçàöèÿ WinSock2
  Sock:=Socket(AF_INET,SOCK_STREAM,IPPROTO_IP); // Ñîçäàíèå ñîêåòà
  if Sock=INVALID_SOCKET then ShowMessage('Îøèáêà ñîçäàíèÿ ñîêåòà!');//Ïðîâåðêà ñîçäàíèÿ ñîêåòà
  SockAddr.sin_family:=AF_INET; //------------------------------------
  SockAddr.sin_port:=htons(Word(80));//Çàïîëíÿþ ñòðóêòóðó äëÿ ñîêåòà
  SockAddr.sin_addr.s_addr := htonl(INADDR_ANY);//--------------------
  if bind(Sock, @SockAddr, sizeof(SockAddr))=Socket_Error then ShowMessage('Îøèáêà ïðèâÿçêè ñîêåòà ê èíòåðôåéñó!') else
  Synchronize(ShowPack);//Ïðèâÿçêà ñîêåòà ê èíòåðôåéñó, ïðîâåðêà ïðèâÿçêè, ñèíõðîíèçàöèÿ ñ ïðîöåäóðîé îáðàáîòêè ïàêåòîâ

  closesocket(Sock);//çàêðûòèå ñîêåòà

  Terminate;//îñòàíîâêà ïîòîêà
end;

procedure TScaner.ShowPack;
begin
recv(Sock,Buf,sizeof(Buf),0);//ïîëó÷åíèå ïàêåòà
Form1.redt.Lines.Add('Start');
if Length(Buf)<>0 then Form1.redt.Lines.Add(string(Buf))
else Form1.redt.Lines.Add('Empty');
end;


procedure TForm1.btn1Click(Sender: TObject);
begin
 //ñîçäàòü ïðîöåññ, íî ïîêà íå çàïóñêàòü
  Scaner:=TScaner.Create(true);
  //Îñâîáîäèòü ïàìÿòü ïðè ïðåðûâàíèè ïðîöåññà
  Scaner.FreeOnTerminate:=true;
  //óñòàíîâèòü ïðèîðèòåò
  Scaner.Priority:=tpLowest;
  //çàïóñòèòü ïðîöåññ
  Scaner.Resume;

end;

end.
пока что вот это, выводит пустую строку... в чем дело, кто знает?
Статьи пока еще читаю, так что может ответ найду, но попозже)
Leloush вне форума Ответить с цитированием
Старый 15.06.2009, 13:30   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Надо или с сервером соединяться (connect), или клиентов принимать (listen/accept).
Somebody вне форума Ответить с цитированием
Старый 15.06.2009, 13:54   #7
Leloush
Пользователь
 
Регистрация: 31.01.2009
Сообщений: 32
По умолчанию

все я во всем разобрался... надо было просто перевести интерфейс в безразборный режим работы, а я пытался прослушивать с помощью коннекта, но мое приложение просто немогло пройти авторизацию на заданом порту и ремот-хосте ибо надо было отправлять пакет фиксированой структуры данных что оно делать немогло, в результате чего и присылался всего 1 пакет, свидетельствующий о закрытии на стороне сервера сокета... сейчас все прекрасно работает, задачу снифера выполняет прекрасно, даже словил пару десятков чужих пакетов с запросами страниц с сайтов которые у меня небыли открыты да и вообще я их первый раз видел так что тему закрывайте

Большое спасибо за статьи, очень понятно написано, правда про неразбочивый режим сокета привязоного к интерфейсу там небыло, но теперь стало горазда легче писать апп с винсокетами, ЗЫ: эти 2 статьи перевод с МСДН, странно что я раньше их невидел, я перед тем как вопрос задать много гуглил)

Последний раз редактировалось Leloush; 15.06.2009 в 19:42.
Leloush вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где взять WinSock2? AngelOfDeath Компоненты Delphi 5 14.03.2009 16:18